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