【问题标题】:Mercurial Getting out of a bad mergeMercurial 摆脱糟糕的合并
【发布时间】:2011-04-29 14:50:13
【问题描述】:

我刚刚将分支 A 合并到 B 中,由于某种原因合并不顺利。我想将 B 恢复到合并之前的位置,然后再试一次,就像以前从未发生过一样。我只是想这样做

hg clone myrepo newrepo -r A -r 12345

其中 12345 是 B 的错误合并提交之前的修订号

我认为这可行,但我还有很多其他分支(其中大部分已使用 commit --close-branch 关闭),这会使这些分支恢复为非活动状态。

有没有办法克隆除修订版 123456 或其他内容之外的所有内容? (其中 123456 是 B 上的错误提交)

【问题讨论】:

  • 您是否将带有错误合并的提交推送到某处?
  • @Lasse 不,它只对我来说是本地的

标签: mercurial


【解决方案1】:

假设您没有将合并变更集推送到任何公共位置,最简单的解决方案是使用 Mercurial Queues(即 mq)扩展附带的 hg strip 命令。

来自wiki

hg strip rev 删除 rev 修订版 以及它的所有后代 存储库。删除不需要的 分支,您将指定第一个 特定于该分支的修订。经过 默认情况下,hg strip 将放置备份 在.hg/strip-backup/ 目录中。如果 脱衣舞原来是个坏主意,你 可以用 hg unbundle 恢复 .hg/strip-backup/filename.

【讨论】:

  • Strip 不仅删除了分支及其修订版,还删除了从该分支到另一个分支的任何合并,这可能是有道理的,但把我搞砸了。
【解决方案2】:

它可能不如 hg 回滚那么好,但通常我所做的是更新到头 A,合并到前一个头 B,检查我这次是否正确,然后 dummy-merge 消除错误的合并。

【讨论】:

    【解决方案3】:

    希望我能正确理解您的情况。如果我是,您应该能够在合并之前更新到 B 的修订版,给该修订版一个新的分支名称,将 A 合并到其中,然后继续。您可能希望将原始 B 分支标记为已关闭。

    $ hg up 12345  #12345 is the revision of B prior to the merge
    $ hg branch B-take2
    $ hg merge A
    $ hg commit -m 'merge A in to B-take2'
    
    $ hg up B
    $ hg commit --close-branch -m 'mark original B branch as closed'
    

    【讨论】:

    • 我想过这个,但我认为肯定有另一种方法,而不必弄乱我的分支名称
    • 我认为没有。可能我对 mercurial 最大的问题是它围绕分支名称的永久性。
    • 我想您可以在合并前的修订版和分支头之间应用反向差异。这将有效地逆转作为合并的一部分引入的更改,并将您留在同一个分支上。它可能会变得一团糟,但可能值得一试。
    • 您无需命名参与此次救援行动的分支机构。
    • @Lasse 如何让原始分支跟随新创建的匿名分支而不是我想要摆脱的路径?
    【解决方案4】:

    使用hg rollback 命令是否为时已晚?如果是这样,请尝试hg backout 命令。

    【讨论】:

    • 回退不适用于合并,之后你不会有两个头,你必须选择其中一个。回滚,带材或部分克隆,是去的方式。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2014-09-07
    • 2020-03-07
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多