[英]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.