大約半年前,一位開發人員搞砸了并將一個他不應該使用的分支(我們的 alpha 測驗分支)合并到 master 中。我們通過恢復合并迅速解決了這個問題。
快進 6 個月,今天我試圖合并在那個糟糕的合并中登陸 master 的分支之一,但 git 說我不能。該分支的更改不在 master 上,但 git 不允許合并。
有沒有辦法強制合并?
uj5u.com熱心網友回復:
該分支的更改不在 master 上
來自該分支的“更改”不是 on master,因為還原合并提交會逆轉這些更改。但是來自該分支的提交是on master。恢復合并提交對此沒有任何作用;它沒有改變拓撲:
A -- B -- C -- D -- M -- Mrevert -- E ... (master)
\ /
X -- Y -- Z
你有看到?X、Y 和 Z仍處于打開狀態master。所以它們永遠不能再次合并master。那輛火車已經離開車站了。
您可以做的是將 X、Y 和 Z 挑選到一個新分支中并將其合并。這是因為cherry pick 做出的新提交與已合并的提交不同。(或者,正如 Romain Valeri 所建議的那樣,只需創建一個包含還原還原的提交的分支,然后將其合并。)
有關更多資訊,請參閱 Linus Torvald 自己對這種情況的解釋以及您的選擇是什么:
https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt
uj5u.com熱心網友回復:
作為解決此問題的一個簡單方法,您可以重寫構成該分支的修訂,以便在 git 中它們與合并的修訂不同。假設分支是從修訂 X 開始的一條直線(X 是屬于此功能分支的第一個修訂,與公共分支分開)并且該分支被稱為the-branch,您可以執行以下操作:
git checkout X~ # keep the pig tail when writing the revision
git cherry-pick HEAD..the-branch
# now you have the exact same revisions that make up the-branch but they are _clones_ of the original revisions....
# to git, they are _not_ the same revisions
git branch -f the-branch # set the-branch over here
git checkout main-branch
git merge the-branch # git will not complain
PS我剛剛注意到這基本上是馬特的答案(我剛剛贊成),只是我已經寫下了步驟供任何人閱讀。
uj5u.com熱心網友回復:
從其他人所說的看來,強制合并似乎是不可能的。
似乎根據您的情況,您必須遵循不同的路徑。
- 如果您合并了一個分支,然后又恢復了它,那么您想重新合并同一個分支,請使用 @matt 解決方案
- 如果您像我的情況一樣,合并了一個包含多個其他分支的分支,合并、還原它,現在您只想合并其中一個分支,您可以使用此解決方案。
- 如果你要合并到非主分支,那么你可以使用
rebase -ffLinus建議的方法,但缺點會丟失分支歷史
此解決方案僅適用于合并到 master,因為合并其他任何內容都會用目標分支的內容污染您的功能分支。
解決方案是將 master 合并回您的功能分支,然后使用這樣的櫻桃選擇重播歷史記錄:
A -- B -- C -- D -- M -- <revert M> -- E -- ............ -- M' (master)
\ / \ /
X -- Y -- Z -- ... -- <Merge master> -- X -- Y -- Z
將 master 合并到 feature 分支后,您又回到了該分支為空的狀態,然后櫻桃采摘提交 X、Y、Z 您又回到了第一次合并之前的相同情況。然后,您可以應用所需的任何更改,然后再次合并。
這樣,您將保留更改歷史記錄(盡管以某種方式受到污染)并且能夠重新合并。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488194.html
