如何撤消不产生合并提交的合并?

时间:2011-11-03 15:45:39

标签: git merge

我从master创建了一个实验分支,并在实验分支上进行了四次提交。与此同时,大师仍然保持着最后的状态。现在,我希望合并我的实验分支,以便将来能够轻松撤消此合并。

当我尝试搜索时,撤消合并的最简单方法在我看来就像git revert hash_of_merge_commit

但是,这仅在我将master与实验分支合并时获得合并提交哈希时才有效。在这种情况下,由于master的HEAD没有进展,当我尝试合并时,我只是将四个新的提交添加到master,这意味着要撤消此合并,我需要手动记住并还原每个这些单独的提交在未来。

有更好的方法吗?

5 个答案:

答案 0 :(得分:15)

其他的回答者似乎一直关注防止这种情况发生。如果已经发生并推送了快速转发的合并,那么这是一个解决方案:

  1. git checkout -b my-undo-branch
  2. git reflog show master - 查找合并前的最后一次提交
  3. git reset --keep SHA - 使用上一步中的SHA
  4. 此时,验证此分支是否处于您希望master处于的状态。现在只需要在这两个分支之间进行差异并将其提交给master:

    1. git checkout master
    2. git diff master my-undo-branch --no-prefix > patchfile
    3. patch -p0 < patchfile
    4. 然后,最后,删除patchfilegit add所有更改,并git commit

答案 1 :(得分:0)

您可以与--no-ff合并以阻止快进合并,这就是“将四个新提交添加到master”的方式。当分支实际上没有发散时,Git会进行快速合并,只是碰到分支引用。防止快进合并将通过明显的合并提交帮助您保持分支历史记录稍微完整,但是您将无法告知分支的名称是否已创建提交。

否则就没有办法检查reflog。 Git不会在每个分支的当前“提示”之外维护分支信息。提交与创建提交时签出的分支之间没有关联。

答案 2 :(得分:0)

一般来说,撤消合并可能是一件棘手的事情。有关背景信息,请参阅http://progit.org/2010/03/02/undoing-merges.html或此other SO question

您可能正在寻找的是:

git merge --no-ff

这将告诉Git它应该创建一个合并提交,即使它没有拥有,就像在这种情况下一样。

答案 3 :(得分:0)

通过将--no-ff传递给merge命令,您应该在没有快进的情况下进行合并。

这样就可以创建新的提交,并且您将能够还原它。

通常,合并功能分支应始终以非快进方式完成,从而使您的功能在master分支的历史记录中得到明确整合。

答案 4 :(得分:0)

我会重新审视你的分支策略并引入“一次性”分支。也就是说,您的CI服务器可能使用的分支或只是您可以查看是否有效。你不应该害怕废弃它们。如果你想保留所尝试的内容,你可以在它被废弃之前标记该分支。

更多相关内容:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

相关问题