【问题标题】:How can I undo a merge which does not produce a merge commit?如何撤消不产生合并提交的合并?
【发布时间】:2011-12-21 07:37:15
【问题描述】:

我从 master 创建了一个实验分支,并在实验分支上进行了四次提交。与此同时,主人仍然留在上次的位置。现在,我想以这样一种方式合并我的实验分支,以便将来可以轻松撤消此合并。

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

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

有更好的方法吗?

【问题讨论】:

    标签: git merge


    【解决方案1】:

    您可以与--no-ff 合并以防止快进合并,这就是您“将四个新提交添加到主控”的方式。当分支实际上没有分叉时,Git 会进行快进合并并简单地将分支 ref 颠倒过来。防止快进合并将通过明显的合并提交帮助您保持分支历史稍微完整,尽管您将无法告知创建提交的分支的名称

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

    【讨论】:

      【解决方案2】:

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

      您可能正在寻找的是:

      git merge --no-ff
      

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

      【讨论】:

        【解决方案3】:

        您应该通过将--no-ff 传递给合并命令来合并而不使用快进。

        这样总是会创建一个新的提交,并且您可以恢复它。

        一般来说,合并功能分支应始终以非快进方式完成,使您的功能集成在master 分支的历史记录中清晰可见。

        【讨论】:

          【解决方案4】:

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

          更多信息在这里:

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

          【讨论】:

            【解决方案5】:

            其他回答者似乎首先关心的是防止这种情况发生。如果快进合并已经发生并被推送,这里有一个解决方案:

            1. git checkout -b my-undo-branch
            2. git reflog show master - 找到合并前的最后一次提交
            3. git reset --keep SHA - 使用上一步中的 SHA

            此时,验证此分支是否处于您希望master 所处的状态。现在只需获取这两个分支之间的差异并将其提交给 master:

            1. git checkout master
            2. git diff master my-undo-branch --no-prefix > patchfile
            3. patch -p0 < patchfile

            然后,最后,删除 patchfilegit addgit commit 的所有更改。

            【讨论】:

            • 只有真正的问题答案。不过,我很惊讶没有更简单的方法可以做到这一点。
            • 其次,这是“真实”的答案。最初的问题假设“没有合并提交” - 用“仅使用 --no-ff”回答实际上是一个错误的答案。
            • 谢谢!这是否会在 master 上留下无法合并以开发的提交,因为它也会从那里删除更改?
            猜你喜欢
            • 2010-12-26
            • 2019-05-13
            • 2021-06-26
            • 2021-05-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-30
            • 1970-01-01
            • 2019-11-15
            相关资源
            最近更新 更多