如何从 hg repo 中删除变更集而不丢失之后提交的变更集

Posted

技术标签:

【中文标题】如何从 hg repo 中删除变更集而不丢失之后提交的变更集【英文标题】:How to remove a changeset from hg repo without loosing changesets commited after that 【发布时间】:2019-06-01 07:42:27 【问题描述】:

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

【问题讨论】:

【参考方案1】:

假设你有变更集:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

(有一个更好的(我认为)方法,但它涉及添加一个非捆绑扩展,特别是evolve extension。请参阅this answer 到一个相关问题。我实际上没有使用进化,我只是喜欢背后的理论。)

【讨论】:

在 histedit(编辑器窗口)中找到您要删除的变更集并将其状态从选择更改为删除。退出编辑器,mercurial/histedit 将删除变更集并合并子项。可能会要求您解决合并冲突。出于这个原因,我建议先备份 repo。 至于 hg-evolve,我目前正在我的工作流/环境中使用它。我对它印象深刻。我认为这是分布式版本控制的下一步。话虽如此,我会警告任何人在学习/理解它的作用之前不要只安装 hg-evolution。您可以在此处找到大量文档:mercurial-scm.org/doc/evolution。虽然 hg-evolve 看起来非常稳定,但它仍然是非常实验性的并且正在进行中。但是,如上所述,我在我的环境中使用它并且对它非常满意。

以上是关于如何从 hg repo 中删除变更集而不丢失之后提交的变更集的主要内容,如果未能解决你的问题,请参考以下文章

Mercurial Repo:hg 验证问题:“第一个损坏的变更集似乎是 3270”

如何签出配置文件并使用mercurial重命名?

hg 删除 .hgignore 中列出的所有文件

我如何在 quicksight 中刷新 csv 数据集而不是替换数据集,因为这会丢失我的计算

Backbone:删除模型而不丢失视图

如何从数据库中删除最后执行的 liquibase 变更集