1、合并
你在一个分支上完成了一个新的功能之后,你像把那个新功能添加到主分支,以便其他的人都可以使用。你可以通过git merge或者git pull命令来实现。
这两个命令的语法是:
git merge [head]
git pull . [head]
在执行结果上,它们是类似的。(虽然现在看来,merge更简单,但是当有多个开发者时,pull就更常用了)。
这些命令执行以下操作,当前head被称为 current,要被合并的head被称为merge。
(1) 识别current和merge的公共祖先,我们称为ancestor-commit 。
(2) 处理简单情况.如果ancestor-commit等于merge,那么什么都不用做。如果ancestor-commit等于current,那么执行快速前向合并。
(3) 否则,找出ancestor-commit和merge之间的改变。
(4) 试图与current中的文件合并那些改变。
(5) 如果没有冲突,创建一个新commit,它包括两个父亲current和merge。设置current(以及HEAD)指向这个新的commit,并且更新当前工作文件。
(6) 如果有冲突,插入一个合适的冲突标记并且通知用户。不创建commit。
注意:在执行合并之前保证所有的更改都已经commit
所以,要实现上面的例子,例如你check out 了master head并且写入了新的数据,现在你想要添加这些新的改变。仓库看起来是这个样子:
+---------------------(D)
| |
(A)---------(B)--------(C)-------------------------(E)
| |
fix-headers master
|
HEAD
E是反映包含新数据的完成的版本。
你可以运行: git merge fix-headers
如果没有冲突,最终版本是这个样子:
+---------- (D) ---------------+
/ | \
(A) -- (B) -- (C) -------------- (E) ------(F)
| |
fix-headers master
|
HEAD
2、解决冲突
当要合并的commit在同一个地方进行更改时,冲突产生。
要解决冲突,编辑文件以修中产生冲突的更改。然后,运行git add 来添加更改的文件,并且运行git commit来提交修改后的合并。Git 记住了你在合并过程中,所以会正确设置commit的父亲。
3、快速前向合并
快速前向合并是在特殊情况下的合并优化。例如你的仓库是这个样子:
+--(D)--(E)
/ |
(A)--(B)--(C) |
| |
current to-merge
|
HEAD
在运行git merge to-merge时,只需要把HEAD指向to-merge即可。
4、通常的合并模式
有两种合并的使用方法:
第一是将新特性合并到主分支中。
第二是将主分支合并到你正在开发的分支中去。缺点是你开发的分支会包含越来越多的合并冲突。解决这个问题的另一个方法是rebasing,尽管他有自己 的问题。
5、删除分支
在将一个开发的分支合并到主分支后,你可能不在需要这个开发分支,那么,你可能要删除它。
要删除一个分支,使用git branch -d [head].命令。