Git

Git 初学者(二)

Git 分支

Posted by Phenomenologist on October 26, 2015

出于实用的考虑,本文略过 Git 实现分支的原理, 仅讨论日常用法。如有兴趣可以参考 Pro Git 的描述。

创建分支

如果还记得上篇文章 Git基础 中提到的指针,那么就会知道,创建分支其实就是创建了一个新的指针。使用的指令是git branch

$ git branch testing

这会在当前所在的提交对象上创建一个testing指针, 但是此时HEAD指针仍然指向原分支,所以准备在testing分支上工作前,需要切换分支。

img

切换分支

需要使用的指令是git checkout:

$ git checkout testing

这样HEAD就指向testing分支了,此时提交代码将会和master分离,产生分叉。

img

当然,需要将HEAD切换回master才能在master分支上提交。 img

以上两条命令可以合并成一句,用一个带有-b参数的git checkout命令:

$ git checkout -b testing

合并分支

是时候将分支的代码整合起来,需要用git merge命令合并分支。首先确定需要并入到哪一条分支,通常情况下会需要并入到master,所以先将HEAD切换到master:

$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html |    1 +
1 file changed, 1 insertion(+)

img Git 将此次合并的结果做了一个新的快照并且让master指向它。这里有一个特殊情况就是当master所指的快照是分支的父节点,那么merge操作将会直接移动master指针到分支指针的位置。 img 如果没有任何冲突,那么合并到这里就结束了。但大部分情况,代码往往不能简单的自动合并,比如两个分支均修改了同一个变量。任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

此时只需要妥善处理冲突,确保已经把 <<<<<<< , ======= , 和 >>>>>>> 这些行完全删除。在解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。

这就是 Git 分支的基本操作,工作中使用往往需要一定的管理策略,可以参考阮一峰的 Git分支管理策略