因爲git rebase
默認情況下不保留合併。這可以用--preserve-merges
但該文檔狀態下被關閉......
它使用--interactive機器內部,但它與--interactive選項結合明確一般不是一個好主意,除非你知道你正在做(見下面的BUGS)。
之所以爲git rebase
是因爲真的重播了您在另一個提交之上的提交,所以合併被淘汰。爲了說明原因,我已經複製了你的回購。
$ git log --oneline --graph --decorate
* 5eb2e82 (HEAD -> master) resolved merge
|\
| * 42cfeab (feature) version 1
* | d6a71b8 version 2
|/
* 267627b added a
當我運行git rebase -i HEAD~~
我看到這一點:
pick d6a71b8 version 2
pick 42cfeab version 1
# Rebase 267627b..5eb2e82 onto 267627b (2 commands)
需要注意的是最後一點, 「到267627b」,這是 「增加了」 提交。這兩個提交,「版本1」和「版本2」將在「添加a」之上進行修補。結果將是線性的,不需要合併。
由於分支,甚至有衝突必須解決。這兩個提交都改變了「添加一個」的同一行,所以不管他們做了什麼順序,他們都會發生衝突。
解決衝突,結果如下。
* d6a71b8 (HEAD -> master) version 2
* 267627b added a
「版本1」的變化在哪裏?解決衝突意味着「版本1」不再有任何改變,所以rebase刪除了空的提交。它這樣做是爲了避免重新引入可能已經合併的提交。您可以用--keep-empty
來關閉此行爲,儘管沒有什麼理由。
如果你想保留的合併,有什麼我建議是先對主上衍合你的功能分支,然後合併並強制合併。假設你有這個。
A - B - C - G - H [master]
\
D - E - F [feature]
首先,將底座特徵放到底座上。
git checkout feature
git rebase master
A - B - C - G - H [master]
\
D1 - E1 - F1 [feature]
這將導致一個線性的歷史,功能現在是大師的頂部,任何衝突都必須解決,功能可與主所有的更新進行測試。
一旦功能已經過測試,它可以與主合併。由於沒有新的變化,通常情況下合併會快速前進,導致這一點。
A - B - C - G - H - D1 - E1 - F1 [feature]
[master]
現在很難看到作爲功能的一部分進行了哪些更改,這些功能是未來調試的重要環境。相反,我們希望保證與--no-ff
合併提交。
git checkout master
git merge --no-ff feature
的結果是這樣的:
A - B - C - G - H ------------ I [master]
\ /
D1 - E1 - F1 [feature]
歷史是線性的,而且它也明確了做什麼提交在一起作爲一個分支,這次合併提交可以用來解釋分支。
這是我正常合併功能分支的過程。
每當我覺得我理解了基本的git,我發現還有另一個我不知道的超級重要的東西。 – max
@max這個界面讓Git看起來好像有103,487個事情,但Git真的只做了大約4件事情。如果您瞭解圖表(如何連接提交),對象ID,標籤(分支和標籤)以及分段區域如何工作,則突然有意義。 – Schwern