Git本地分支管理
前两节我们学习了Git的安装和本地的基本使用,这一节我们来学习Git的本地分支管理,当然还有远程分支,远程分支就要结合我们的GitHub了。
1,分支概念
分支其实就是指向某次提交的一个可变指针,我们怎么知道当前是属于哪个分支呢,就在于HEAD这个指针,Git默认的分支是master,HEAD严格来说并不是指向提交,而是指向master,master才是指向提交的,所以HEAD指向的就是当前分支。
分支管理有什么好处呢?比如我们多个人共同开发一个项目时,为了不影响主分支的开发,项目中的每个成员都可以拉一个自己的分支,然后各自在各自的分支上进行开发工作,功能完成之后再合并到主分支上就可以了,下面我们来进行分支的操作。
2,创建分支
创建分支前我们先看一个问题,
在上图中我们发现只有当提交了之后才能查询到主分支master,这也说明了Git的分支必须要指向一个提交,没有提交就没有任何分支,提交之后Git自动创建了master主分支,因此,创建一个分支也相当于是创建一个新的分支指针指向当前所在的提交。
以上用到的新的命令:
git branch (查询分支)
git branch -a (查询所有分支)
下面我们来创建第一个分支,
git branch b1和git checkout b1可以合并为一个命令:git checkout -b b1(创建并切换到b1分支上),切换之后就是这样的:
下面我们在b1分支上对branch.txt文件进行修改和提交看会发生什么,
如上图,当我们最后又切换到master分支上时,发现我们的修改并没有效果,这是因为我们是在b1分支上进行修改提交的,此时引出了合并分支的概念,比如把我们的b1分支合并到master分支上,那在b1分支上的修改也就同步到了master分支上,如下图:
合并分支后,我们发现在b1分支上的修改已经同步到了master分支上。
注意看上图中的合并分支后,显示有”Fast-forward”信息,”Fast-forward”的意思是快进,也就是说这是合并分支是快进模式,也就是直接把master指向了b1的当前提交,所以合并速度非常的快。
3,删除分支
合并完分支之后,就可以删除b1分支了,git branch -d b1命令删除。
涉及到的命令:
git branch b1 (创建b1分支)
git checkout b1 (切换到b1分支)
以上两个命令可以合并为一个命令:git checkout -b b1(创建并切换到b1分支上)
git merge b1 (把b1分支合并到当前分支)
git branch -d b1 (删除b1分支)
4,冲突的产生和解决
冲突产生的原因:我们在不同分支修改同一个文件,合并分支的时候就会产生冲突。
我们先新建一个分支,并在这个分支上修改branch.txt的内容,然后进行提交,如下图所示:
我们再切换到master分支上,也修改该文件内容并提交:
我们现在来把b2分支合并到master分支上:
这时候就产生冲突了,并且提示我们修复冲突然后再提交结果,怎么修复冲突呢?我们先来看下状态和被修改文件的内容:
“Unmerged paths:”告诉了我们合并时产生冲突的文件,就是branch.txt
下面我们来解决冲突:在上图中我们已经通过cat branch.txt看到了不同分支上的不同修改,我们可以直接在该文件中进行修改,只保留我们需要的修改,不管是保留master分支上的还是保留b2分支上的都可以,然后提交就OK了。
5,合并分支
合并分支有两种形式:快速合并(git merge b1
)和普通合并(git merge --no-ff b1
),注:b1为分支。
我们注意到上边我们合并分支的时候显示”Fast forward”,也就是快速合并,这种形式下,我们看不出来做过合并,但是普通合并一眼就能看出来分支曾经做过合并。
这两种形式的合并费了好大一会儿时间才明白其区别,下面进行详细对比说明:
总结一下吧,
快速合并(git merge b1
)
普通合并(git merge --no-ff b1
)
注:b1为分支名
两者的不同:普通合并我们可以看到被合并的分支信息(我们是不是在上图中git log的时候看到普通合并的时候会有分叉),但是快速合并我们就看不到了(看不到是因为没有显示分叉,我们看到的只是一条线而已)。
6,分支管理策略
下面介绍一下一般开发一个项目关于分支的策略,一般会分为以下几类分支:
6.1 主分支 master
Git主分支的默认名字master,是版本库初始化以后自动建立的,主分支只有一个,用来发布用户使用的正式版本。
6.2 开发分支 develop
平时开发工作应该是在另一分支上完成,这就是我们的develop分支,开发工作完成之后,我们就可以把develop分支合并到master分支上,然后发布正式版本。
6.3 功能分支 feature
如果我们需要开发一个特定的功能,我们就可以在develop分支上拉出来一个分支,然后在这个特定的功能分支上进行开发,开发完成之后合并到develop分支上。
6.4 预发布分支 release
这个版本是正式版本发布前的一个版本,比如说用来进行内测等,是从develop分支拉出来的一个分支,所以需要合并到develop分支上。
6.5 bug分支 fixbug
bug分支,就是用来修复bug而拉的一个分支了,修复完bug之后也需要合入到对应的分支上。
小结:以上介绍的还都是本地分支管理,当然还有远程分支,本地的分支操作就先总结到这里吧,下次结合GitHub学习一下关于远程的操作。