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
这不需要用力推动。如果很多人撤销回购协议,这不是一个选项。这是否也考虑了合并标志?