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 的最新提交,所以称之为快进合并。

这是未合并之前的情形,

Fast Forward Merge before merging

在快进合并以后,master 指针直接移动到 test_branch 的最新提交上。

Fast Forward Merge after merging

Recursive 递归合并

在我们介绍这种不同的 git 合并策略之前,我们需要创建两个分支 test_branch_Atest_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_Ctest_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_Dmaster 中,

$ 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 提交解决好的冲突。