【问题标题】:How to undo metadata changes of a commit in mercurial?如何撤消 mercurial 中提交的元数据更改?
【发布时间】:2015-10-23 10:59:58
【问题描述】:

我最近将开发分支中的一个变更集移植到了默认分支中。之后,我的更改按需要默认。

但出乎意料的是,该签入发生了许多元数据级别的变更集更改。详细来说,

  • 仅存在于我的开发分支中而不存在于默认分支中的几个文件在默认情况下被标记为已删除。
  • 某些文件中仅存在于我的开发分支中而不存在于默认分支中的几行额外的行在默认情况下被标记为已删除。

Mercurial 已将默认中实际上不存在的某些文件和行标记为默认分支中已删除的文件和行。

因此,当我尝试再次与默认值合并时,mercurial 会将这些文件和行从默认值中删除,并尝试从我的分支中删除它们。

我尝试退出以单独恢复有问题的提交。遗憾的是,backout 只会更改签入期间修改的源代码行,但不会删除删除不可用文件和行的元数据标记。

是否有任何方法可以撤消不希望发生的提交元数据级别的更改?非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 这种行为不是 mercurial 默认所做的,通常是不可重现的。您应该提供一个实际演示所声称行为的测试用例。 graft 仅复制变更集,不复制不属于被移植的变更集的信息:paste.openttdcoop.org/pdpucmoml
  • @planetmaker 是的,我知道这不是默认行为,当我尝试再次重复相同的过程时,它无法重现。因此,我什至无法证明所解释的行为:(
  • 您是否可能以错误的方式进行合并,告诉您的合并工具主要保留“错误”方面的内容?

标签: mercurial backout


【解决方案1】:

如果您有一个错误的提交并且只想忘记它曾经发生过,并且该提交没有后代,您可以通过 hg strip 将其从历史记录中完全删除(需要 strip extension )。

如果提交确实有后代,您可以使用hg histedit(需要histedit extension)删除您不想保留的变更集。

这两种解决方案都涉及编辑历史记录,如果您将错误的提交公开分发,这是有风险的。您将不得不与可能拉过错误提交的每个人或其任何后代进行协调,这并不总是可能的(例如在开源环境中)。您还需要在服务器端重做这些更改,因为 Mercurial 的 push --force 不像 Git 的 push --force

如果你不想编辑历史,你可以将错误提交的后代嫁接到最后一个已知的好祖先(例如hg up good_ancestor; hg graft 'bad_commit:: - bad_commit'),然后在坏头上执行hg commit --close-branch。确保在关闭分支提交上留下信息丰富的提交消息,以便其他开发人员知道在哪里重新设置错误提交的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2018-03-16
    • 2016-08-02
    • 1970-01-01
    • 2012-05-09
    • 2020-07-28
    • 2021-09-30
    相关资源
    最近更新 更多