web前端学习记录(0)之git教程学习1
目录
1.2.4.6.1场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
1.2.4.6.2场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改(如图1-13),分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
1.2.4.6.3场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
1 git平台搭建
Git是什么?
一个帮助你管理文件,记录更新日志的工具,你的每一次更新,它都帮你做好记录,让你修改文件再无烦恼,“无限备份”。
无需联网,就可以记录你的日志路径,保存在电脑内部,随时可以进行操作;多人协作要怎么办???他说,你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
廖雪峰老师的介绍:
https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000
Git怎么用?
1.2.1 Git简介
1.2.2在Windows系统中安装
参考廖雪峰老师的教程,链接如下
https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496
1.2.3 创建版本库
https://www.liaoxuefeng.com/wiki/896043488029600/896827951938304
- 创建版本库(创建一个空目录)
$ mkdir learngit
$ cd learngit
注意:pwd命令是mac系统中查看当前目录的命令,而Windows中每行命令前面的路径,就是当前路径!如果非要查看,可以使用命令 dir
(2)将版本库变成Git可以管理的仓库(此时是空仓库)
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
注意:如果你的电脑输入ls命令时,显示“其不是内部命令”,可以尝试在路径C://Windows/下新建一个ls.bat文件,内容如下:
@echo off
dir
(可以先在桌面上建好再拖进相应的目录)
1.2.4时光机穿梭
1.2.4.1 在版本库中新建文件
(1)使用命令git add <file>,注意,可反复多次使用,添加多个文件;
(2)使用命令git commit -m <message>,完成。
注意:添加的这个文件,必须是你已经在目录中编写好了的文件,而且这个文件需要你放到仓库中,所以当你没有新建该文件,或者名字和格式与输入的不符都会显示fatal(错误)
图1-1
1.2.4.2 监控本地修改内容
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
图1-2
1.2.4.3 仓库中版本回退
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
(1)知道有哪些历史版本?
git log
图1-3
让输出更简洁
Git log --pretty=oneline
图1-4
将当前版本“append GPL”退回到“modify readme.txt’s content”版本
(2)知道有哪些历史命令?
git reflog
图1-5
(3)穿越到某个版本
git reset –hard commit_id(版本号可只写前几位)
图1-6
后悔了回到过去,那我们可以选择回来。先查看历史命令,寻找倒退之前的头版本号,这里可以找到是12765开头的,我们输入git reset –hard 12765 回车,就可以看到,又回到了“现在”。
图1-7
1.2.4.4 工作区和暂存区的区别
https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576
图1-8(来自廖雪峰git教程)
1.2.4.5 管理修改
理解Git是如何跟踪修改的,每次修改,如果不用git add到暂存区,那就不会加入到commit中。
用type readme.txt命令查看readme.txt文件内容
图1-9
如图1-10,如果git add <file>后,修改<file>文件,再git commit -m <message>,提交的只是倒数第二次修改的信息,而未提交最后一次修改的信息,如果想要提交最后一次修改内容,需要进行add 、commit的第二次操作,如图1-11。
图1-10
图1-11
1.2.4.6 撤销修改
1.2.4.6.1场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
实战:
如图1-12所示,我们在文件左后一行添加了My stupid boss still prefers SVN.
现在我们想要撤销掉上次的修改,就可以进行下列操作。
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
我们可以用type命令行看一下,内容已经回到了修改之前。
图1-12
1.2.4.6.2场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改(如图1-13),分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
图1-13
如图1-14,可以用git status查看修改只是添加到了暂存区,还未提交,可以用git reset HEAD<file>可以把暂存区的修改撤销掉(unstage),git reset命令既可以回退版本,也可以把暂存区的修改退回到工作区。当我们用HEAD时表示是最新版本。再用git status查看一下,现在暂存区是干净的,工作区有修改。输入git checkout -- readme.txt,世界终于清静了!
图1-14
1.2.4.6.3场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
实战:
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把stupid boss提交推送到远程版本库,你就真的惨了……
1.2.4.7删除文件
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
实战:
Windows系统在本地进行删除的时候,rm不能使用,可以使用del命令,删除时我们可以查看当前状态,仓库中的还未修改,所以我们使用git rm <file>进行删除,并上传操作说明。
如果删除错了,后悔药在1.2.8中有介绍,git checkout –test.txt命令行进行拯救一下。
1.2.5 远程仓库
远程仓库介绍以及如何实现远程仓库与本地仓库之间的联系如下:
https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416
1.2.5.1 添加远程库
https://www.liaoxuefeng.com/wiki/896043488029600/898732864121440
要关联一个远程库,使用命令git remote add origin [email protected]:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
注意:create a new repository时,不要勾选任何选项,不然后续操作是不会成功的哦!!
1.2.5.2 从远程库克隆
https://www.liaoxuefeng.com/wiki/896043488029600/898732792973664
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
1.2.6分支管理
https://www.liaoxuefeng.com/wiki/896043488029600/896954848507552
让多人协作开发日志与自己的进度日志不会冲突,每人一个分支,当属于你的分支没有bug时,提交到主分支,实现代码的多次迭代,让你们团队合作更和谐!
1.2.6.1创建与合并分支
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
教程传送门:
https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424
实战:
创建新分支的步骤见https://www.cnblogs.com/wulibo/p/10608471.html
1.2.6.2解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
实战:
在新开发的feature1分支下提交readme.txt文件后,切换到master分支,在master分支下新建同名readme.txt文件,然后将feature1分支合并到master分支下,因为master分支下已有readme.txt文件,所以引发冲突,合并失败!
git status也可以告诉我们冲突的文件
也可打开readme.txt文件进行查看,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
,我们修改如下后保存:
可以查看分支合并情况,然后删除feature1分支
工作完成!!!
注:用git log --graph命令可以看到分支合并图。
1.2.6.3分支管理策略
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
实战:
可以看到,不使用Fast forward模式,merge后就像这样:
1.2.6.4Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
实战:
1.2.6.5Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
实战:
1.2.6.6多人协作
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
实战:
1.2.6.7Rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
1.2.7标签管理
https://www.liaoxuefeng.com/wiki/896043488029600/900788941487552
1.2.7.1创建标签
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
命令git tag可以查看所有标签。
实战:
1.2.7.2操作标签
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
实战:
实战:
1.2.8使用GitHub
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可以推送pull request给官方仓库来贡献代码。
实战:
1.2.9使用码云
1.2.10自定义Git
https://www.liaoxuefeng.com/wiki/896043488029600/900785521032192
1.2.10.1忽略特殊文件
忽略某些文件时,需要编写.gitignore;
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
实战:
1.2.10.2 配置别名
给Git配置好别名,就可以输入命令时偷个懒。我们鼓励偷懒。
实战:
1.2.10.3搭建Git服务器
搭建Git服务器非常简单,通常10分钟即可完成;
要方便管理公钥,用Gitosis;
要像SVN那样变态地控制权限,用Gitolite。
实战:
1.2.11使用SourseTree
使用SourceTree可以以图形界面操作Git,省去了敲命令的过程,对于常用的提交、分支、推送等操作来说非常方便。
SourceTree使用Git命令执行操作,出错时,仍然需要阅读Git命令返回的错误信息。
实战: