Git 教程 - 合并分支
我们将在本节教程中学习如何合并分支以及如何解决可能的冲突。
在上一教程中,我们学到了创建了一个新的分支来实现一些新功能,并且不会弄乱 master
分支。
在我们创建这些新分支并对新功能感到满意之后,我们需要将其合并回 master
分支。这样,当我们发布下一个版本代码时,新功能会被包含其中。
Fast-forward
快进合并
假设我们对 new_test_branch
分支的结果感到满意,我们会将其合并回 master
分支。
-
切换成
master
分支
$ git checkout master
-
将新分支合并到
master
分支
$ git merge new_test_branch
Updating 5fef94e..e7a7e81
Fast-forward
test3.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
我们从分支 new_test_branch
中得到了新功能并将其合并到此 master
分支中。
在上面消息中显示的 Fast-forward
意味着 Git 合并的时候进行的是快进合并,也就是直接把 master
指向 test_branch
的最新提交,所以称之为快进合并。
这是未合并之前的情形,
在快进合并以后,master
指针直接移动到 test_branch
的最新提交上。
Recursive 递归合并
在我们介绍这种不同的 Git 合并策略之前,我们需要创建两个分支 test_branch_A
和 test_branch_B
并且对它们进行不同的更改。然后我们将合并 test_branch_A
回到 master
分支。
现在我们来把 test_branch_B
分支合并到 master
。
$ git merge test_branch_B
Merge made by the 'recursive' strategy.
test1_rename.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
这种合并策略和 fast-forward
快进合并之间的区别在于合并是由递归策略进行的,因为此分支代码中没有集成 test_branch_A
分支中的新特性。换句话说,master
分支在 test_branch_B
创建后被修改了。
现在 master
分支将两个新特性分支都合并进来了,所以是否不同开发人员同时处理不同特性分支,这对 Git 来说并不重要,只要最后能将它们合并回 master
就好。
解决冲突
我们在上面的两个测试分支中修改的内容没有任何冲突,但是如果分枝间存在冲突时,我们将某分支合并到 master
时要怎么办呢?
让我们创建两个分支 test_branch_C
和 test_branch_D
,然后附加文字 The letter should be C
到分支 test_branch_C
中的文件 test3.txt
中,然后附加文字 The letter should be D
到分支 test_branch_D
的文件 test3.txt
中。
然后我们将 test_branch_C
合并到 master
分支中。
现在,我们将合并 test_branch_D
到 master
中,
$ git merge test_branch_D
Auto-merging test3.txt
CONFLICT (content): Merge conflict in test3.txt
Automatic merge failed; fix conflicts and then commit the result.
你可以在此处看到它无法成功合并,因为它检测到文件 test3.txt
中的冲突。我们需要通过手动编辑冲突文件来解决冲突。
该文件 test3.txt
显示冲突为,
<<<<<<< HEAD
The letter should be C
=======
The letter should be D
>>>>>>> test_branch_D
HEAD
和 =======
之间的文本是 master
分支的内容,它来自已经合并进来的 test_branch_C
分支,这部分文字不同于待合并分支 test_branch_D
中的对应文字。
你需要选择将要最终合并到 master
分支中的文字,并删除所有符号,比如 <<<<<
和 >>>>>
。
比如说,这部分文字应该是 The letter should be D
。我们将冲突区域更新为 The letter should be D
。
解决冲突后,我们可以通过使用 git commit
提交解决好的冲突。