什麼是 Git 中的三路合併或合併提交?


讓我們來看一個三路合併的例子。在這個例子中,Feature 分支比Master 分支超前兩個提交。

圖 1

在我們將其與 Master 合併之前,假設我們在 Master 中添加了另一個提交,如下面的圖所示。

圖 2

由於在 Master 分支上進行了提交,我們的MasterFeature 分支現在都已分叉。

這意味著Master 分支中有一些Feature 分支中沒有的更改。如果在這種情況下執行合併,Git 將無法將 master 指標移向Feature 分支。

如果 git 只是將 Master 指標移動到Feature 指標,那麼在Master 分支上執行的最新提交C6 將丟失。

那麼,如果分支已分叉,我們如何執行合併呢?

當我們想要合併已分叉的分支時,Git 會建立一個新的提交(合併提交),並將這兩個分支的更改合併在一起,如下面的圖所示。

圖 3

它被稱為三路合併的原因是合併提交基於三個不同的提交。

  • 我們分支的共同祖先,在本例中是提交編號C3。此提交包含我們在分叉成不同分支之前的程式碼。

  • Master 分支的頂端,即在 Master 分支上執行的最後一個提交 - C6

  • Feature 分支的頂端,即在 Feature 分支上執行的最後一個提交 - C5

為了合併來自這兩個分支的更改,Git 會檢視三個不同的快照 - 之前的快照和之後的快照。基於這些快照,Git 透過建立名為合併提交的新提交來合併更改。

示例

$ git init
$ echo one>1.txt
$ git add .
$ git commit -m 'c1'
$ echo two>2.txt
$ git add .
$ git commit -m 'c2'
$ echo three>3.txt
$ git add .
$ git commit -m 'C3'
$ git branch feature
$ git switch feature
$ echo four>4.txt
$ git add .
$ git commit -m 'c4'
$ echo five>5.txt
$ git add .
$ git commit -m 'c5'
$ git switch master
$echo six>6.txt
$ git add .
$ git commit -m 'c6'
$ git merge feature
$ git log --oneline --all --graph

輸出

hint: Waiting for your editor to close the file... unix2dos: converting file E:/git_clone/test_repo/.git/MERGE_MSG to DOS format...
dos2unix: converting file E:/git_clone/test_repo/.git/MERGE_MSG to Unix format...
Merge made by the 'recursive' strategy.
4.txt | 1 +
5.txt | 1 +
2 files changed, 2 insertions(+)
create mode 100644 4.txt
create mode 100644 5.txt

* e1ce060 (HEAD -> master) Merge branch 'feature'
|\
| * 3435c89 (feature) c5
| * 7e7761b c4
* | 5618675 c6
|/
* 6ad93bf C3
* 9031c20 c2
* 3f68f83 c1

更新於:2021年4月30日

5K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告