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

How to remove a changeset from hg repo without loosing changesets commited after that

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

从技术上讲,您不能: 变更集包含其所有父历史,因此通过删除 123b,您将销毁其所有后代。任何直接子代现在都被损坏,因为它们指的是不存在的 123b,并且这些子代的任何子代都被间接损坏,依此类推。

不过,也有好的一面。您可以用新的、改进的后代替换所有后代。为此,请使用 hg histedit。这是您必须首先启用的捆绑扩展。 (参见,例如,What are the best and must-have hg / mercurial extensions?)(或者,可以使用 rebase 或 graft,但我不建议这样做——histedit 更简单。)

请注意,histedit 本质上等同于剥离变更集及其所有后代,然后添加新的变更集。因此,如果您通过将变更集 public 发送到另一个克隆来制作变更集,它将立即从 来自 那个另一个克隆,以及它的所有后代。默认情况下,histedit 不会让您编辑 public 变更集,以免您犯此错误。另见 https://book.mercurial-scm.org/read/changing-history.html

(有一个更好的(我的意见)方法,但它涉及添加一个非捆绑扩展,特别是 evolve extension. See this answer 到相关问题。我没有实际使用过进化,我只是喜欢这个理论在它后面。)

假设您有变更集:

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

(你的123b可以表示为,这里说B)。

如果 B、C 和它们的后代 none 已被推送(因此它们只存在于您的本地存储库中),那么您可以先将 C 变基为 A,然后剥离 B。