2012-07-23 50 views
6

我有一堆提交,说A,B,C,D,我想保留B,C和D,并作出(BCD)-1的提交。如果我有很多要同时撤消的提交,那么最简单的方法是什么?如何恢复Mercurial中的多个提交?

(我似乎记得看到有关这个计算器疑问,建议我hg update到A,然后调用hg commit一些争论,但似乎我现在不能找到这个问题。)

回答

1

你”已经回答了你自己的问题,更新回A,并从那里继续。如果您需要在这一点上做出新的努力,则需要对文件或其他文件进行更改,如下所述:How can I force mercurial to accept an empty commit。与该帖子链接的mail thread描述了一种使用MqExtension删除BCD的方法(除非您推送了它们):

+0

这,但只有当D是一个头。 hg中没有垃圾回收,所以B,C和D不会丢失。 D将只是一个你可以推动或不推动的头 - 取决于你。 – DanMan 2014-03-28 21:23:03

4

听起来像您在寻找backout。请参阅:

hg help backout 

我不认为它可以在一个回去了多次提交,所以你必须分别备份出来:

hg backout D 
hg backout C 
hg backout B 

这将在d之上建立三个提交该是D和C和B的反向。如果要将这些提交合并到一个更改集中,可以使用rebase --collapse或其他扩展名之一(例如histeditmqcollapse扩展名)将其折叠。

如果你不想背出个人的变化,但把一切都一气呵成,你可以做到以下几点:

hg update A 
hg debugsetparents D 
hg commit -m "revert B-D" 

它的丑陋,但它的工作原理。但是,这不会记录相反的重命名。说实话,我不会推荐这样做,如果你需要退出这么多,以至于单个退出命令的输入太麻烦了,让我想知道退出是否真的是你想要为这个特定做的事情案件。

或者,你可以像吉姆和拉斐尔建议的那样做,并且决定B,C和D在分支上,然后更新回A并继续在那里提交(在那个时候分解历史)。这可能更合适。

+0

这会做我想做的事情(如果我把mq中的三个提交压缩在一起),但是如果有50个提交,我想撤消它会变得很难处理。 我正在寻找更接近http://stackoverflow.com/questions/1463340/revert-multiple-git-commits(但是对于hg)的接受答案的第二部分,即,相当于git的gg重置 - hard A && git reset --soft @ {1} && git commit -a' – 2012-07-23 16:07:26

+0

我用一种方法在Mercurial中更新了答案。然而,就像你链接到的git答案一样,它实际上并没有扭转变更集。这真的让我想知道为什么你会想要恢复如此大的变更集序列。将它们停放在不活动的分支上,似乎更好,并在此之前继续进行。如果你在你的问题中描述了你的用例,它可能会帮助你更好地解决你的问题。 – 2012-07-25 09:11:00

+0

此外,您可能需要考虑向Mercurial提交功能请求,以便退回命令接受修订集而不是单个修订版。 – 2012-07-25 09:13:02

4

最简单的方法:

您在变更d和要终止该分支

hg commit --close-branch -m "Branch closed" 

现在,只要到变更集A和继续你的工作commiting新东西

hg up -r A 
... change stuff ... 
hg ci -m "New stuff" 

有B,C和D的分支会在那里,但它会被终止,它不会在hg heads中显示。这将是一个不活跃的分支。

这很容易做到,也很有表现力。如果你看图,你会看到一个单独的分支被关闭,“官方”分支将继续。比在分支机构中产生噪音的回复和回退变更要好得多。

+1

正如[另一个问题](http://stackoverflow.com/questions/3688263/mercurial-beheading-当你试图将封闭的头部推送到另一个存储库时,你会得到一个关于创建多个头部的警告。所以,在你第一次推时使用'hg push --force'。拉封闭的人不会得到任何警告。 – mernst 2013-06-21 15:14:30