版权声明:
除非注明,本博文章均为原创,转载请以链接形式标明本文地址。


二刷廖雪峰老师的git教程

Thanks:https://www.liaoxuefeng.com/wiki/896043488029600

Git是什么?

Git是目前世界上最先进的分布式版本控制系统

版本控制的理解:廖老师举了一个写word的例子(相当于写毕业论文),写了很多个版本,又不能删除,管理麻烦,而且当别人帮你修改后,如何更好的合并也是个问题。

发明者:Linus大佬(同为Linux发明者)

分布式的理解:理解了什么是集中式,分布式很好理解

安装

一般Linux发行版都预装,都很好装,查找相应教程即可。

初始配置

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

创建版本库

1
2
3
$ git init #初始化仓库
$ git add *** #把文件添加进Git仓库
$ git commit -m "wrote a readme file" #把文件提交到Git仓库,-m参数后面为本次提交的说明

commit的理解:你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

更深入理解:从工作区和暂存区角度出发

版本控制

版本信息查询:

1
2
3
4
$ git status  #查询文件是否被修改
$ git diff **** #详细查询文件的不同
$ git log #查询所有commit历史记录
$ git log --pretty=oneline #如果嫌输出信息太多

版本回退:

1
2
3
$ git reset --hard HEAD^  #回退到上一个版本,回退后,不能看到版本之后的修改内容
$ git reset --hard commit_id
$ git -reflog #记录每一次命令,使用这个操作,可以在回退后重新回来,利用id号

在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

撤销修改

1
$ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

1
$ git rm test.txt  #删除文件,或者rm再git add,git commit

远程仓库

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

1
$ ssh-keygen -t rsa -C "[email protected]"

可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

第三步:创建GitHub仓库,根据GitHub的提示完成推送

1
2
$ git remote add origin [email protected]:×××/×××.git #origin就为远程仓库
$ git push -u origin master #推送master分支到远程

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

简化命令即为:

1
$ git push origin master

克隆

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但ssh协议速度最快。

分支管理

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git checkout -b dev  #创建dev分支,然后切换到dev分支
$ git switch -c dev #创建并切换到新的dev分支

#相当于:
$ git branch dev #创建dev分支

$ git checkout dev #切换到dev分支
$ git switch master #直接切换到已有的master分支

$ git branch #查看当前分支
$ git merge dev #合并分支
$ git branch -d dev #删除dev分支
$ git branch -D feature-vulcan #如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

解决冲突

详细参考博客中例子:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344

分支管理

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。下面我们实战一下--no-ff方式的git merge

1
$ git merge --no-ff -m "merge with no-ff" dev

bug分支

https://www.liaoxuefeng.com/wiki/896043488029600/900394246995648

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

多人协作

1
2
3
$ git remote  #查看远程库的信息
$ git remote -v #显示更详细的信息
$ git pull #拉取远程分支

拉取其他分支,解决冲突方法:https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320

标签管理

1
2
3
4
5
6
7
8
9
$ git tag v1.0  #给当前分支版本打标签
$ git tag #查看所有标签
$ git tag v0.9 f52c633 #利用commmit id 打标签
$ git show #查看标签信息
$ git tag -a v0.1 -m "version 0.1 released" 1094adb #创建带有说明的标签是
$ git tag -d v0.1 #删除标签
$ git push origin v1.0 #推送本地标签到远程
$ git push origin --tags #推送所有标签
$ git push origin :refs/tags/v0.9 #删除远程标签