如何在Mercurial中恢复多个提交?

时间:2012-07-23 05:13:56

标签: mercurial undo revert

我有一堆提交,比如A,B,C,D,我想保留B,C和D,然后提交(BCD)-1。如果我有多个提交要同时撤消,那么最简单的方法是什么?

(我似乎记得看到一个关于这个的stackoverflow问题,建议我{A}到A,然后用一些参数调用hg update,但我现在似乎无法找到这个问题。 )

3 个答案:

答案 0 :(得分:5)

听起来你正在寻找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"

这很难看,但它确实有效。但是,这不会反过来记录重命名。说实话,我不建议这样做,如果你需要退出太多以至于单独的退出命令太麻烦而无法输入它让我想知道退出是否真的是你应该为那个特定的做什么情况下。

或者,你可以按照Jim和Rafael的建议去做,并决定B,C和D在一个分支上,并更新回A并继续提交(在那时分开历史记录)。这可能更合适。

答案 1 :(得分:4)

最简单的方法:

您处于变更集D中,并且您希望终止该分支

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

现在,只需转换A并继续工作,提交新内容

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

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

这很容易做到也很有表现力。如果您查看图表,您将看到一个单独的分支已关闭,“官方”分支将继续。比那些恢复和撤销变更集在你的分支中产生噪音要好得多。

答案 2 :(得分:1)

您已回答了自己的问题,请更新回A并从那里继续。如果您需要在此时重新开头,则需要对此处所述的某个文件或其他文件进行更改:How can I force mercurial to accept an empty commit。从该帖子链接的mail thread描述了使用MqExtension删除BCD的方法(除非您已将其推送):