前言
今天这篇文章我们继续git教学的第五篇,主要讲解的是git的分支管理,这也号称是git的‘必杀技特性’。
git
分支是什么?
git通过保存一系列不同时刻的文件快照来实现数据存储。
每次在进行git提交时,都会生成一个提交对象,这个提交对象都会产生一个指向暂存区内容快照的指针。而且每个提交对象中都会包含一个指向上一次提交(父提交对象)的指针。
通过这一系列指针的指向,就构成了一个分支上的所有提交记录。如下图中,一个分支上的三次提交记录,生成三个版本快照,然后通过指针相连。
提交记录
因此对于分支,我们可以理解为指向提交对象的可变指针。
分支创建与切换
对于每个git仓库都有一个默认的master分支,实际上master分支和其他自定义分支没有任何区别。
我们可以通过git branch命令去创建一个新的分支,但是并不会直接切换至新建的分支。如果需要切换到新的分支,是通过git checkout命令。
如果我们需要将这两步操作合并为异步,则可以通过git checkout加-b参数实现。
这也意味着以下的命令是等价的。
$ git branch dev
$ git checkout dev
$ git checkout -b dev
因为分支的创建都是基于指针的,那么在拥有多个指向相同历史的指针时,git怎么知道当前是在哪个分支呢?
在git中有一个特殊的HEAD指针,指向的是当前所在本地分支的最新快照,当我们切换到新的分支中时,HEAD分支也会随着移动。
如下图中,有master和testing两个分支,HEAD指针指向的是master,表示的是当前处于master分支上。
HEAD指针
通过git branch命令也可以查看当前处于哪个分支上。如果当前在哪个分支上,则在分支名之前有一个‘*’标识。
git branch
分支的合并
在一个上线的项目中,一般至少会有多个用于运行的分支,比如生产环境一般是master分支,开发环境下的dev分支,测试环境下的test分支,还有一系列的个人开发分支self。
分支的合并有merge指令即可完成,merge完成后两个分支记录将处于同一个状态。
比如我们在发现一个线上问题时,需要由master分支新拉一个hotfix分支进行问题的修复,此时的分支情况可能如下如所示。
分支记录
在hotfix分支上修复完问题后,可以切换至master分支,然后将hotfix分支合并至master分支。
合并分支
在分支合并完后,分支情况如下图所示。
合并后的分支
删除本地分支
当我们不再需要一个本地分支时,可以通过-d参数来删除它。
有一点需要注意的是,需要先checkout到别的分支才能删除需要删除的分支。
如上一个例子,当hotfix修复完毕后可以将hotfix分支删除。
删除分支
有冲突时的分支合并
当多人协同开发时,出现文件冲突是一件很常见的事情。
冲突的原因是同一个文件的同一个部分,在不同的分支中都有修改,这样git就无法自动合并,而是将有冲突的信息暴露出来交由开发人员自己修改后再进行合并。
当我们通过merge命令合并有冲突的分支时,会出现CONFLICT字眼,如下图中的提示信息。
冲突提示
当出现冲突时,是无法merge成功的,后续的操作也将被阻塞住,因此解决冲突是一步必要的操作。
冲突文件内容
如果文件冲突后,我们打开冲突的文件,冲突部分的内容会有很明显的
领取专属 10元无门槛券
私享最新 技术干货