Mercurial Undo Merge

时间:2010-06-30 14:02:43

标签: mercurial branch

我们有意无意地将命名分支(ABC)合并到我们的default分支中。

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

有没有办法撤消这个?

4 个答案:

答案 0 :(得分:8)

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

[extensions]
hgext.mq=

如果你不熟悉它,Mq extension让你操纵历史。好消息是,这将允许我们修复你的回购。坏消息是任何克隆混乱仓库的人都必须再次克隆它,因为我们将改变历史。

首先,再次使用你的仓库克隆,所以我们不会弄乱任何东西。

现在,找到合并变更集的修订版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并继续。如果您在另一个补丁上再次遇到相同的错误,请按照相同的过程进行操作。

答案 1 :(得分:4)

如果您尚未公开发布回购,则​​可以执行此操作

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

并删除旧的仓库。

答案 2 :(得分: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 不应合并到默认。我们要解决这个问题的方法是使用带有backout选项的parent命令,如下所示:

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

通过这个你不撤消合并本身:看一个分支图(使用图形日志或在TortoiseHg中)你仍然会看到 SomeBranch 进入在r1728 默认。然而,合并的结果是撤消的,这意味着包含退出的变更集(在我的情况下为r1729)与r1727相同。

答案 3 :(得分:1)