2010-06-30 68 views
12

有一种情况,我们故意将已命名分支(ABC)合并到我们的default分支中。Mercurial Undo合并

hg rollback不是一种选择,因为自那以后有过几次提交。

有没有办法解决这个问题?

回答

4

如果您还没有发布回购公开,你能做到这一点

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

并删除旧的回购。

+0

This Works ... thanks!现在我还有一个问题:如何在错误合并到新克隆的存储库后应用更改集? – 2010-06-30 14:28:53

+0

@Steve看到我的答案。你必须在老头上“改造”它们。 – tghw 2010-06-30 14:29:37

+0

回退无法撤消合并。 – tghw 2010-06-30 14:31:19

8

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

[extensions] 
hgext.mq= 

如果您不熟悉它,可以使用Mq extension来操纵历史记录。好消息是,这将使我们能够修复您的回购。坏消息是,任何拥有复制的repo的克隆人都必须再次克隆它,因为我们将改变历史。

首先,让你的repo的另一个克隆工作,所以我们不会搞砸任何东西。

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

一旦你有了这两个修订版本的标识,你可以回到你的命令提示符和cd进入你的回购。然后输入了以下内容,用适当的修订ID替换changeset[M|N]

$ 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

UPDATE

我忘了说:如果有人基于东西,是只有在其他分支的变化,有可能hg qpush -a将失败。你会看到一个foo.txt.rejfoo.txt.orig文件铺设。不幸的是,你必须自己解决这个问题。要解决此问题,请打开原始文件.orig文件和.rej文件,然后选择合适的更改以将其保存在原始文件中。将它合并后,使用hg qrefresh将该修补程序更新到新的合并修补程序。从他们,你应该能够再次运行hg qpush -a并继续。如果您在另一个修补程序中再次遇到相同的错误,请按照相同的步骤进行操作。

+0

我和你在一起,直到hg qpush -a。我在控制台中得到以下内容: 正在申请xxx.diff 修补文件----- 群发#1失败806 1个群发失败 - 保存拒绝“...” 补丁失败,无法继续 ... 申请过程中的错误,请修复并刷新310.diff – 2010-06-30 15:21:33

+0

请参阅我答案中的更新部分。 – tghw 2010-06-30 17:54:25

+0

这破坏了历史,所以如果错误已经传播,它将不起作用。请参阅:http://stackoverflow.com/questions/265944/backing-out-a-backwards-merge-on-mercurial – 2010-07-22 17:02:46

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完全相同。

+0

这是否也照顾合并标志? – elzapp 2017-11-17 15:16:54