2011-12-14 78 views
7

我想弄清楚爲什麼rebase需要三路合併。舉例來說,如果我們有爲什麼git rebase需要3路合併?

A1 - A2 
\ 
    B1 

而且我已經簽出B1,我想執行:

git rebase A2 

爲什麼git的合併A2,B1和A1?爲什麼A2和B1不夠?我的意思是,不要將A2和B1作爲提交包含樹的完整當前快照?

+1

謝謝你,那正是我試圖用我的問題展示的東西。 – worker1138 2011-12-14 23:21:05

回答

7

要執行合併,Git需要找出自從共同祖先(A1)以來在兩個分支中發生了什麼。正如你所說的,Git存儲提交/樹的快照以獲得實際更改集,它必須比較A2A1B1A1,然後合併這些單獨的更改集。

同樣的事情發生在rebase中。要在B1上應用變更集A2,我們首先需要根據A1A2之間的差異計算變更集。然後我們可以將其應用到B1。你可以把rebase想象成類似於自動生成補丁文件的東西。首先它從舊分支生成所有這些補丁文件,然後將它們應用於當前的HEAD。因此,我們需要所有這三個提交來真正計算差異,因爲我們無法通過查看提交來找出提交中發生的情況。

+0

謝謝你,這很有道理。 – worker1138 2011-12-14 23:32:45