什麼是 Git 中的三路合併或合併提交?
讓我們來看一個三路合併的例子。在這個例子中,Feature 分支比Master 分支超前兩個提交。
圖 1
在我們將其與 Master 合併之前,假設我們在 Master 中添加了另一個提交,如下面的圖所示。
圖 2
由於在 Master 分支上進行了提交,我們的Master 和Feature 分支現在都已分叉。
這意味著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
廣告