如何在不丢失之后提交的变更集的情况下从 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。
我需要删除一个变更集,比如 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。