菜鸟笔记
提升您的技术认知

Git系列:分支管理

•写在前面

讲到Git的分支管理还是比较激动的,因为Git的分支管理简直太好用了,效率又高,虽然SVN也有分支管理,但是这些版本控制系统创建和切换分支相当的慢,基本都不去用,而Git不管版本库中的文件数量有多大,都能在短短的一秒内完成操作,简直就是团队协作开发的利器。

•理解分支管理

在讲相关的指令之前呢,需要先理解分支管理,这样有助于后面命令的使用。形象的来讲,每一条分支就是一条时间线,在之前的文章中,都是在一条时间线上完成的,所以只有一条分支master,而这条分支一般都被我们成为主分支。之前我们有用到HEAD进行版本回退操作,HEAD指向提交,但是严格的讲,HEAD并不是指向提交,而是指向master,在最开始的时候,master分支只有一条线,Git用master指向最新的提交,再用HEAD指向master,如下图所示。

每次提交,master分支都会往前移动一步,这样随着提交增多,master分支的先就越来越长。当我们创建新的分支,例如branch1时,Git新建了一个指针叫branch1,指向master相同的提交,再把HEAD指向branch1,就表示当前分支在branch1上。

这个时候,Git创建一个分支很快,因为除了增加一个branch1指针,改改HEAD的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对branch1分支了,比如新提交一次后,branch1指针往前移动一步,而master指针不变。

假如我们在branch1上的工作完成了,就可以把branch1合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向branch1的当前提交,就完成了合并。

所以Git合并分支也很快!就改改指针,工作区内容也不变!合并完分支后,甚至可以删除branch1分支。删除branch1分支就是把branch1指针给删掉,删掉后,我们就剩下了一条master分支。

•使用分支指令

使用一下指令进行创建分支和切换分支。

$ git checkout -b branch1  

#branch1是分支名,这条指令意味着创建一个branch1分支,并
#切换到branch1分支上,它相当于一下两条分支一起执行

$ git branch branch1
$ git checkout branch1

#现在我们可以执行以下指令查看当前分支,结果在下面右图,注意前面有个*,
#这个*代表当前所在分支
$ git branch

现在我们在文本中再进行一次修改,然后添加并提交,这个时候我们是在branch1分支上进行修改的,指令运行图和分支演示图如下图。

现在有了一个branch1分支,我们可以进行分支合并了,将branch1分支合并到主分支上,使用如下指令。

$ git merge branch1  #在上左图的情况合并分支

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。合并完成后,就可以放心地删除dev分支了:

$ git branch -d branch1

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

•分支切换switch

前面使用了git checkout ,前面还是用了git checkout -- 进行命令的撤销。但是实际上用switch切换分支更加有效,更科学,可以使用如下指令。

$ git switch -c branch1 #创建并切换到新的branch1分支

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

•下一步

总结一下分支指令

查看分支:git branch

创建分支:git branch

切换分支:git checkout 或者 git switch

创建+切换分支:git checkout -b 或者git switch -c

合并某分支到当前分支:git merge

删除分支:git branch -d

下一篇文章准备讲分支执行中可能会出现的一些情况,提交冲突,bug分支等等问题。