[英]revert merge to master, keep feature branch changes, without changing history
我有一個功能分支和一個主分支。 我對該功能做了一些工作,合並到 master 中,推送更改,然后遠程和本地刪除功能分支。 到現在為止還挺好。
合並后,我意識到我的功能更改存在問題。 我想撤消對 master 的合並,但仍保留功能更改,以便我可以再次處理它們。 我不想重寫master的歷史,因為其他人也在努力。 我認為我最好的選擇是使用revert
進行新的提交來解決問題?
我原來的:
A---B---C---D [master]
\
E----F [feature]
我現在所擁有的:
A---B---C---D---E'---F' [master]
我想要的是:
A---B---C---D---E'---F'---RE'---RF' [master]
\
E"---F" [feature]
RE' 還原 E',RF' 還原 F'。 同時E”包含與原始E相同的內容,F”包含與原始F相同的內容。
我該如何實現?
同樣,有很多方法可以做到這一點。 考慮到您想要的最終狀態,這是我最喜歡使用的命令序列 - 它最終只是與您繪制的頭發不同:
git checkout master
如果需要,然后git revert HEAD~2..HEAD
得到:
A--B--C--D--E'--F'--RF'--RE' <-- master (HEAD)
請注意,帶有范圍的git revert
以相反的順序提交。
git checkout -b feature
:
A--B--C--D--E'--F'--RF'--RE' <-- master, feature (HEAD)
git cherry-pick HEAD~4..HEAD~2
,再次復制E--F
:
A--B--C--D--E'--F'--RF'--RE' <-- master \\ E"--F" <-- feature (HEAD)
如果它有幫助——使用更長的提交鏈,它可能——你可以為各種提交添加臨時標簽。 例如,如果您從以下內容開始:
A--B--C--D--E'--F' <-- master
並運行:
git tag T1 HEAD~2; git tag T2 HEAD
你得到:
T1 T2
| |
v v
A--B--C--D--E'--F' <-- master
所以現在你可以在任何地方使用T1..T2
來表示“提交E'
和F'
,這樣 revert 命令變成:
git revert T1..T2
櫻桃選擇變成:
git cherry-pick T1..T2
完成后,您可以刪除兩個臨時標簽:
git tag -d T1 T2
因為他們只是在那里記住兩個特定提交的哈希 ID,這些提交划定了“有趣”提交的范圍。 相對名稱( HEAD~2..HEAD
或master~2..master
)隨着您添加更多提交並導致名稱移動而更改其編號。
我會:
master
git checkout master
git revert HEAD~2..HEAD
git push
feature
分支git checkout -b feature
feature
提交git cherry-pick HEAD~4..HEAD~2
git push
你可以做
# make sure you're working from master
git checkout master
# revert commits E and F
# (but in reverse chronological order is better to avoid unnecessary conflicts)
git revert F E
此時你的樹看起來像
A---B---C---D---E---F---F'---E' [master]
# then create your new branch
git checkout -b feature
# and here you might as well revert the reverts
git revert E' F'
最終獲得
A---B---C---D---E---F---F'---E' [master]
\
E''---F'' [feature]
但是我建議在第一次還原期間使用-n
對E
和F
進行分組(然后您必須在之后提交),在下一階段還原還原會更容易,並且歷史記錄將更具可讀性。 像這樣 :
git checkout master
git revert -n F E
# (at this point, if you had to resolve conflicts, don't forget to add them)
git commit
git checkout -b feature
git revert E'
最后一棵樹:
A---B---C---D---E---F---E' [master]
\
E'' [feature]
(其中最后一個模式E'
是E
和F
的還原)
僅當您對整個情況感到滿意時才推動所有這些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.