【问题标题】:Mercurial Undo MergeMercurial 撤消合并
【发布时间】:2011-03-10 03:55:31
【问题描述】:

有一个场景,我们无意中将命名分支 (ABC) 合并到我们的 default 分支中。

hg rollback 不是一个选项,因为从那以后有几个提交。

有没有办法撤消这个?

【问题讨论】:

    标签: mercurial branch


    【解决方案1】:

    您将需要 Mq 扩展。如果您没有打开它,请将其添加到您的 Mercurial.ini.hgrc 文件中。

    [extensions]
    hgext.mq=
    

    如果您不熟悉它,Mq extension 让您操纵历史。好消息是,这将使我们能够修复您的回购。坏消息是任何人如果克隆了这个乱七八糟的代码库,就必须再次克隆它,因为我们将改变历史。

    首先,创建另一个你的 repo 的克隆版本,这样我们就不会搞砸任何事情。

    现在,找到合并变更集的修订 ID(合并 default 和您命名的分支)。写下来。我们将其称为changesetM。现在找到下一个变更集的修订 ID。写下来。我们将其称为changesetN

    获得这两个修订版 ID 后,转到您的命令提示符并 cd 进入您的存储库。然后输入以下内容,将 changeset[M|N] 替换为适当的修订 ID。:

    $ hg qimport -r changesetN:tip
      # This will add all of your changes since the merge to the queue
    $ hg qpop -a
      # This pops them all out of your history.
    $ hg strip changesetM
      # This removes the merge changeset.
    $ hg update -C default
      # Make sure we're on the default branch
    $ hg qpush -a
      # Take the changesets in the queue and push them back onto your history.
    $ hg qfinish -a
      # Remove changesets from the queue and finalize them as normal changesets.
    

    本质上,您是在默认分支之上重新构建新的变更集,并在流程中删除合并变更集。完成后,您需要将更改推送到服务器上的新存储库,并让您的同事克隆新副本。

    最后,如果您有任何其他 Mercurial 问题,也请查看kiln.stackexchange.com

    更新

    我忘了提一下:如果有人基于仅在另一个分支中的某些内容进行了更改,hg qpush -a 可能会失败。你会看到一个foo.txt.rejfoo.txt.orig 文件放在周围。不幸的是,你必须自己解决这个问题。要修复它,打开原始文件、.orig 文件和.rej 文件并选择要合并的正确更改,将它们保存在原始文件中。将其合并后,使用hg qrefresh 将该补丁更新为新的合并补丁。从他们那里,您应该能够再次运行hg qpush -a 并继续。如果您在另一个补丁上再次遇到相同的错误,请按照相同的过程进行操作。

    【讨论】:

    • 我和你在一起直到 hg qpush -a。我在控制台中得到以下信息:应用 xxx.diff 修补文件 ----- Hunk #1 FAILED at 806 1 out of 1 hunks FAILED -- 保存拒绝“...”补丁失败,无法继续...错误申请时请修复并刷新310.diff
    • 这会破坏历史,因此如果错误已被传播,它将无法工作。见:stackoverflow.com/questions/265944/…
    • hg strip 这不需要强制推送。如果很多人拉下 repo,这不是一个选择。
    【解决方案2】:

    如果您尚未公开发布 repo,您​​可以这样做

    hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new
    

    并删除旧的仓库。

    【讨论】:

    • 这行得通...谢谢!现在我还有一个问题:如何在错误合并到我新克隆的存储库后应用变更集?
    • @Steve 看我的回答。您必须将它们“重新定位”在旧头上。
    • @SteveHorn - 应用变更集的一种方法是将它们导出为补丁,然后在需要的地方导入它们。
    【解决方案3】:

    我今天遇到了以下情况:

    @    changeset:   1728:5d703e1051d3
    |\   parent:      1727:1a5f73b5edb4
    | |  parent:      1720:65ddd0bde225
    | |  user:        nn
    | |  date:        Wed Feb 27 10:35:00 2013 +0100
    | |  summary:     Merge with SomeBranch
    | |
    | o  changeset:   1727:1a5f73b5edb4
    | |  user:        nn
    | |  date:        Wed Feb 27 10:34:30 2013 +0100
    | |  summary:     lorem ipsum
    | |
    [some more changesets]
    | |
    o |  changeset:   1720:65ddd0bde225
    | |  branch:      SomeBranch
    | |  user:        nn
    | |  date:        Wed Feb 27 07:44:46 2013 +0100
    | |  summary:     lorem ipsum
    

    其中 SomeBranch 不应该被合并到 default 中。我们解决这个问题的方法是使用backout 命令和parent 选项,如下所示:

    hg backout --rev=1728 --parent=1727
    

    这样您不会撤消合并本身:查看分支图(使用图表日志或在 TortoiseHg 中)您仍然会看到 SomeBranch 进入默认 在 r1728。然而,合并的 result 被撤消,这意味着包含回退(在我的情况下为 r1729)的变更集与 r1727 相同。

    【讨论】:

    • 这是否也处理合并标志?
    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2016-02-04
    • 2016-06-02
    • 2019-08-29
    • 2013-06-07
    相关资源
    最近更新 更多