Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial撤消合并_Mercurial_Branch - Fatal编程技术网

Mercurial撤消合并

Mercurial撤消合并,mercurial,branch,Mercurial,Branch,有这样一个场景:我们无意地将一个命名分支(ABC)合并到我们的default分支中 hg rollback不是一个选项,因为从那以后已经有几次提交 有办法撤销吗?如果您没有公开发布回购协议,您可以这样做 hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new 并删除旧的回购。您将需要Mq扩展。如果没有打开,请将其添加到Mercurial.ini或.hgrc文件中 [extensions] hgext.mq= 如

有这样一个场景:我们无意地将一个命名分支(
ABC
)合并到我们的
default
分支中

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


有办法撤销吗?

如果您没有公开发布回购协议,您可以这样做

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

并删除旧的回购。

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

[extensions]
hgext.mq=
如果你不熟悉,那就让你来操纵历史吧。好消息是,这将允许我们修复您的回购协议。坏消息是,任何复制了混乱回购协议的人都必须再次复制,因为我们将改变历史

首先,再复制一份回购协议,这样我们就不会把事情搞砸了

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

一旦有了这两个修订ID,就转到命令提示符,并将
cd
放入repo。然后键入以下内容,将
变更集[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.
本质上,您是在默认分支的顶部重新设置新变更集的基址,从而在流程中删除合并变更集。完成后,您需要将更改推送到服务器上的新存储库,并让同事克隆新副本

最后,如果你有任何其他反复无常的问题,也请查看

更新


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

我今天遇到了以下情况:

@    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

这样,您就不会撤消合并本身:查看分支图(使用graph log或在Ortoisehg中),您仍然会看到某个分支在r1728处进入默认状态。然而,合并的结果是撤消的,这意味着包含回退的变更集(在我的例子中是r1729)与r1727相同。

这是有效的。。。谢谢现在我还有一个问题:如何在错误合并后将变更集应用到我新克隆的存储库中?@Steve看到我的答案了。您必须在旧的头上“重新设置”它们的基础。@SteveHorn-应用变更集的一种方法是将它们导出为补丁,然后在需要的地方导入它们。在hg qpush-a之前,我一直支持您。我在控制台中得到以下信息:应用xxx.diff修补文件------Hunk#1在806失败,1个Hunk中的1个失败--保存拒绝“…”修补失败,无法继续。。。应用过程中出现错误,请修复并刷新310。此操作将破坏历史记录,因此如果错误已传播,则此操作将不起作用。请参阅:
hg strip
这不需要用力推动。如果很多人撤销回购协议,这不是一个选项。这是否也考虑了合并标志?