如何在不丢失之后提交的变更集的情况下从hg仓库中删除变更集

时间:2019-01-06 11:05:28

标签: mercurial commit changeset .hgtags hg-revert

我需要删除一个更改集说123b,它位于分支中几个更改集的中间。 123b之后,我提交了许多变更集。如何在不丢失最近更改的情况下删除更改集123b

2 个答案:

答案 0 :(得分:1)

从技术上讲,您不能:变更集包括其所有父级历史记录,因此,通过删除123b,可以销毁其所有后代。现在,任何直接子代都由于不存在的123b而受到损坏,而这些子代中的任何子代也受到间接破坏,依此类推。

但是,有一个好的方面。您可以用改进的新后代替换所有后代。为此,请使用hg histedit。这是一个捆绑扩展,必须首先启用。 (例如,参见example)(或者,也可以使用rebase或graft,但我不建议这样做-histedit更简单。)

请注意,histedit本质上等同于剥离变更集及其所有后代,然后添加新的变更集。这样,如果您通过将变更集发送到另一个克隆来将其公开,则它稍后将与另一个克隆及其所有后代一起从 返回。默认情况下,histedit不允许您编辑公共变更集,这样就不会出错。另请参见What are the best and must-have hg / mercurial extensions?

(有一种更好的方法(我认为),但它涉及添加一个非捆绑式扩展名,特别是https://book.mercurial-scm.org/read/changing-history.html。请参见evolve extension。我只是喜欢它的理论。)

答案 1 :(得分:1)

说您有变更集:

A-B-C-D-....

(您的123b可以用B表示)。

如果B,C及其后代还没有被推送(因此它们仅存在于您的本地存储库中),那么您可以先将C重新设置为A,然后剥离B。