【问题标题】:Reapply an ancestor change that's been backed out重新应用已撤消的祖先更改
【发布时间】:2014-07-02 17:35:23
【问题描述】:

好的,这里是复杂的 mercurial 场景,但是 mercurial 中的每个场景似乎都变得复杂了。

我们有 2 个分支,开发和测试。在 dev 中进行了很多更改,然后合并到 test 中,如下所示:

hg update test
hg merge dev
hg commit -m "merging dev into test yo"
hg push

但后来我们意识到我们不希望开发人员进行所有这些更改。所以我像这样退出了:

hg backout --rev=<test rev of my commit> --parent=<test rev from before the merge>

这成功撤消了合并中的所有更改。

问题是:我现在想从 dev 分支中移植一些更改,但它忽略了所有更改,说“跳过祖先修订 X”

有没有办法重新应用这些更改? (除了导出和重新导入差异?)

【问题讨论】:

    标签: version-control mercurial


    【解决方案1】:

    我不知道你的test 分支的实际状态,但如果你仍然接近退出,我建议改为在初始合并之前 分支出test。使用此选项,您将不会从其他分支继承父级。

        @    new head
        |
        |
      o |    backout
      | |
      | |
      o |    bad merge
     /| |
    | | |
    o | |    other branch
    | | |
    | |/
    | o      before merge
    | |
    | |
    

    之后,从dev 移植你需要的东西,并通过discarding the backout completely 重新合并两个头以保持一个头。

    【讨论】:

    • 我做过类似的事情。我有这个问题stackoverflow.com/questions/23377982/… 并且进行虚拟合并以移除额外的头部似乎有效。但后来我读到关于合并有利于一个父母,这似乎是更直接的方式。
    • 我知道我以前看过你的案子!
    • 所以看起来这两种解决方案仍然存在相同的问题?无论哪种方式,我想要的转速都在我的历史记录中,我必须将它们重新区分是吗?
    • 并非如此。如果您从合并之前开始,当前的解决方案将删除父母。 graft 将是可能的,因为父母不会出现在历史记录中。仅在移植更改之后重新合并两个头。
    【解决方案2】:

    OP 确实明确表示他们希望避免使用差异,但这种方法在某些情况下效果很好,而其他人可能会觉得它很有用。他们也没有说明为什么要避免导入/导出(差异)。

    取自this blog

    您可以使用此命令重新应用您的更改。

    假设您的更改在修订版 78 中。

    转到你的 repo 的根目录并运行:

    hg export 78 | hg import

    这将自动重新提交修订版 78 中所做的任何更改。您还可以指定不自动提交的选项,和/或您可以导出到文件,然后在单独的步骤中导入。

    【讨论】:

      【解决方案3】:

      使用-f 选项强制hg graft 继续进行:

      hg graft -f -r 12345
      

      (这是对this question的回答)

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 2016-01-11
        • 2021-09-01
        • 2015-01-30
        • 2016-08-02
        • 2019-07-31
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多