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提交解決好的衝突。