我有一堆提交,比如 A、B、C、D,我想保留 B、C 和 D,并进行 (BCD)⁻¹ 的提交。如果我有许多要同时撤消的提交,那么最简单的方法是什么?
(我似乎记得看到一个关于这个的stackoverflow问题,建议我hg update
去A,然后hg commit
用一些参数调用,但我现在似乎找不到那个问题。)
听起来您正在寻找backout
. 看:
hg help backout
我认为它不能一次退出多个提交,因此您必须单独退出:
hg backout D
hg backout C
hg backout B
这将在 D 之上创建三个提交,它们与 D、C 和 B 相反。如果您想将这些提交组合到一个变更集中,您可以使用rebase --collapse
或使用许多其他扩展中的一个来折叠它们(例如,histedit
或mq
或collapse
扩展名)。
如果您不想退出单个更改,而是一次性完成所有更改,您可以执行以下操作:
hg update A
hg debugsetparents D
hg commit -m "revert B-D"
这很丑陋,但它有效。但是,这不会反向记录重命名。老实说,我不建议这样做,如果您需要退出太多以至于单独的退出命令很难键入,这让我想知道退出是否真的是您应该为那个特定做的事情案子。
或者,您可以按照 Jim 和 Rafael 的建议进行操作,并确定 B、C 和 D 在一个分支上,然后更新回 A 并继续在那里提交(此时拆分历史记录)。这可能更合适。
最简单的方法:
您在变更集 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
. 这将是一个非活动分支。
这很容易做到,也很富有表现力。如果您查看图表,您会看到一个单独的分支已关闭,“官方”分支将继续运行。比让那些在您的分支中产生噪音的恢复和撤销变更集要好得多。
您已经回答了自己的问题,更新回 A 并从那里继续。如果你需要在那个时候做一个新的头,你需要对一些文件或其他文件进行更改,如下所述:我如何强制 mercurial 接受一个空的提交。从该帖子链接到的邮件线程描述了一种使用 MqExtension 删除 BCD 的方法(除非您已推送它们):