撤销 git 合并操作并允许稍后重新合并

4

如何撤销已提交的git合并操作,同时保留随后可能再次合并同一分支的选项?

当我将一个分支合并到HEAD时,发现我目前不想要这些更改,但仍希望在将来的某个时候将它们合并到HEAD。

"git revert -m 1"将代码还原为合并之前的状态,但该分支仍被标记为“已合并”。因此,稍后再次与相同的分支合并将无法正常工作。

尽管这应该是一个非常常见的问题(而且git是一个成熟的工具),但我无法找到一个简单干净的解决方案(除了摧毁git存储库并从远程重新拉取)。我有什么遗漏吗?

3个回答

7

很遗憾,您浪费了您的分支。

但是有一个解决方法。诀窍是暂时“重写”合并提交,使其忘记该分支是父级。假设X是合并提交:

git replace --graft X X^   # pretend that there is just one parent
git merge branch           # merge the branch again
git replace --delete X     # remove the replacement

哇,一旦我理解了你在这里说的话,那真是一个有用的技巧。不错! - Lasse V. Karlsen
哇,这既邪恶又聪明。 - knittl

1
如果您的合并提交尚未推送且它是顶部提交,则可以使用重置命令。
git reset --hard HEAD^

请注意,所有未提交的更改都将丢失。

1

如果您还没有发布合并提交(推送到中央服务器),最好的解决方案是重写历史记录以删除合并提交。

  1. 如果合并提交后没有其他提交,请将 HEAD 重置为上一个提交:

git reset HEAD^

  1. 如果合并提交后有其他提交,则需要进行 rebase 并删除合并提交,同时重新应用其他提交。

git rebase -i

如果您已经发布了合并提交,您需要决定是更好地重写历史记录以保留分支的正确合并潜力,还是仅添加一个还原提交。这将需要与可能已下载合并的所有人交谈。

如果无法重写历史记录,则需要执行还原操作:

git revert -m 1

在这种情况下,分支的未来合并需要手动干预。您可能需要挑选未被合并捡起的提交,或还原您的还原提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接