我有一个 Git 分支,它是一个显示项目
topic
的分支 master
。我将它与 master 合并并手动解决了冲突。之后,修复了master
中的一个严重错误,我再次合并,这次没有冲突。在两次合并之间我自己没有提交任何内容,也没有将分支推送给其他任何人。我想合并这两个合并。
我现在拥有的是:
master ----A---B-----C---------->
\ \
topic ---W-----X-----Y-------->
地点:
我想把它变成:
master ----A---B---C----------->
\
topic ----W---------X'-------->
其中 X' 现在是在单个合并提交中合并冲突解决和错误修复的合并。
我知道我可以通过检查 W 并合并
master
来手动完成此操作,并在不可避免的冲突期间从 X 复制已解析文件的内容。有没有一种更快、更不容易搞砸的方法(在冲突很大且丑陋的情况下)?
如果您确实至少从
W
起就没有推动过任何事情,那么这可能是完成它的最简单的方法(除了实际的冲突解决 - 我猜这可能会很痛苦):
git checkout topic
git reset --hard W
git merge master
如果您从
W
开始推送(特别是如果 X
或 Y
存在于您的存储库之外的任何地方),我不确定是否有一个干净的解决方案 - 无论您做什么,您会给任何其他包含 X
或 Y
的存储库带来问题。
当然,您必须重新进行冲突解决,除非您启用了
rerere
。
更快?
git checkout topic
git rebase -i W
然后您可以压缩最后两次提交。
git merge -ours master
(再次记录
master
和 topic
之间的合并,而不必“重做”合并)
您还可以尝试使用
-p
(--preserve-merge
) 选项,以保留 master 和 topic 之间的合并链接
git rebase -p -i W
很确定你可以在这里做
git rebase origin/master
..
还有一点就是分店便宜。为什么不为你的
topic
创建一个单独的克隆,说 topic'
然后操纵他,最后你可以在它和 topic
之间进行比较,以表明你没有改变任何东西(只有提交历史改变了) )