
所以我犯了一個很大的錯誤。我進行了提交、拉取、合併(但這樣做時弄亂了程式碼),然後推送。我想重做合併並使程式碼正確。有什麼辦法可以做到這一點嗎?
我使用位桶。
答案1
不確定這是否是「有福的」方式,但這是我為解決同樣的問題所做的,而不必「強行推動」或類似的事情。
讓我們假設你的歷史看起來像這樣(M 是錯誤的合併):
-A--B--C--M (master points here)
\ /
D----E
git checkout -b merge_fix <commit ID E>
在我們犯任何錯誤之前運行會創建一個分支:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
現在,讓我們在新分支上重新進行合併。我們不能只是合併master
,所以我們需要在錯誤合併之前手動選擇提交:git merge <commit ID C>
不要犯上次犯的同樣的錯誤!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
假設提交G
看起來不錯,現在我們想要與分支頂部同步master
。此命令告訴 git 忽略對 master 所做的更改,並強制我們的更改成為合併結果:git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
最後,(再次假設提交H
看起來不錯,我們希望快轉master
以包含我們的固定合併:
git checkout master
git merge merge_fix
這實際上只是將master
分支指針移至H
,但我將藉此機會稍微清理一下我的 ASCII 藝術:
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
現在你就擁有了!您已成功重新完成合併,且沒有使任何歷史記錄無效!
答案2
你可以這樣做,像這樣:
- 重置為合併之前的提交。
- 再次執行合併
- 強力推
那是:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
請記住,這git push --force
將重寫您在遠端分支上的所有內容,並且使用該分支的其他人也可能會受到此影響。 (通常您不應該這樣做。)
答案3
git merge --abort
然後你可以再次合併
答案4
我有一個不同的、更複雜的設定。
基本上有三個起點:(其他解都假設 1 或 2)
redo-branch
應該完全合併並且
在合併redo-branch
之後沒有其他合併redo-branch
應該完全合併並且
合併之後redo-branch
已經有其他合併,應該保留redo-branch
是一個長壽的分支重複合併 AND
僅進行一定範圍的修訂曾是合併的一部分並且
已經有master 上的其他提交/合併合併失敗後(哎喲)
(3) 的設定是
---A--B--C--M (master points here)
/ /
-X--D-----E--Y (that's the long-living redo-branch)
- 你應該可以解決問題https://superuser.com/a/691497/308385
- 與 1 相同的解決方案可能有效
- 讓我們開始吧 :-)
# let's start on the last commit before the failed merge
git checkout redo-branch
git checkout -b D^1 new-branch-for-merge
# now let's pick all the revisions D through E
git cherry-pick D^1..E
# go to the target branch (master) and merge
git checkout master
git merge new-branch-for-merge