有沒有辦法在 git 中重做合併?

有沒有辦法在 git 中重做合併?

所以我犯了一個很大的錯誤。我進行了提交、拉取、合併(但這樣做時弄亂了程式碼),然後推送。我想重做合併並使程式碼正確。有什麼辦法可以做到這一點嗎?

我使用位桶。

答案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

你可以這樣做,像這樣:

  1. 重置為合併之前的提交。
  2. 再次執行合併
  3. 強力推

那是:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

請記住,這git push --force將重寫您在遠端分支上的所有內容,並且使用該分支的其他人也可能會受到此影響。 (通常您不應該這樣做。)

答案3

git merge --abort 然後你可以再次合併

答案4

我有一個不同的、更複雜的設定。

基本上有三個起點:(其他解都假設 1 或 2)

  1. redo-branch應該完全合併並且
    在合併redo-branch之後沒有其他合併
  2. redo-branch應該完全合併並且
    合併之後redo-branch已經有其他合併,應該保留
  3. redo-branch是一個長壽的分支重複合併 AND
    僅進行一定範圍的修訂曾是合併的一部分並且
    已經有master 上的其他提交/合併合併失敗後(哎喲

(3) 的設定是

---A--B--C--M   (master points here)
  /        /
-X--D-----E--Y  (that's the long-living redo-branch)
  1. 你應該可以解決問題https://superuser.com/a/691497/308385
  2. 與 1 相同的解決方案可能有效
  3. 讓我們開始吧 :-)
# 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

相關內容