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