【问题标题】:In Mercurial, how do I pick specific files from a named branch to merge back with default?在 Mercurial 中,如何从命名分支中选择特定文件以与默认分支合并?
【发布时间】:2010-06-29 11:24:12
【问题描述】:

我有一个很大的命名分支,其中有很多变化。其中一些更改是非破坏性的,因此我想首先选择这些特定文件,并尽快将它们与默认值合并。 (然后,破坏性更改也被合并。)

在 Git 中,我将创建另一个分支并压缩索引之外的所有变更集,然后将特定文件添加到索引并提交。之后,我可以将此临时分支与 master 合并,以便 master 有一个干净的提交,只有非破坏性的更改。我不知道如何用 Mercurial 做到这一点。

【问题讨论】:

标签: file merge mercurial branch


【解决方案1】:

您可以使用hg cat 来获取文件的内容,因为它存在于任何特定分支上,并用它替换工作副本版本。

从技术上讲,这不是合并,但是由于您要替换整个文件,因此以后合并内容应该不会太糟糕:

例如,要从分支somefeature 中获取myfile.c,并替换工作副本版本,请执行以下操作:

hg cat path/to/myfile.c -r somefeature > path/to/myfile.c

请注意,这将完全替换工作副本文件,因此请先确保您没有未完成的更改

【讨论】:

    【解决方案2】:

    我认为mercurialqueues 是你想要的。使用mq,您可以将任何变更集转换为补丁,并将任何补丁转换为变更集。因此,将变更集转换为补丁,从补丁中删除您不想要的块,然后将其应用于您想要的任何分支。虽然这是一个相当 complex 的操作,但您需要一定的纪律。因此,在您关心的代码上尝试之前,我会尝试在测试存储库中确定您的工作流程。

    【讨论】:

    • 感谢您的链接,我会检查出来。现在我似乎找到了答案(见上面的评论)。
    • 这很酷。我基本上是想为 mizipzor 关于 mq 的回答提供一些可信度。
    【解决方案3】:

    据我所知,Mercurial 没有任何工具来拆分变更集。如果幸运的话,您想要的所有更改都在单独的更改集中,然后您可以使用TransplantExtension。我认为它可以与 Git 的 cherry-pick 相提并论,但我没有使用 git。

    您还可以使用 hg diff 手动将某个文件的更改提交到新分支。使用 rev 范围标记您的整个源分支:

    hg diff myfile -r startrevision:endrevision
    

    输出可以被视为一个补丁。对您想要的每个文件执行此操作并提交它们,然后合并。跳过破坏性的变化。当然,您也可以多次执行此操作,因为破坏性更改位于修订范围的中间。

    话虽如此,您尝试做的并不是 mercurial 的目标。核心历史编辑更多的是 Git 的领域(请注意,这只是我的看法)。将您的稳定更改和破坏性更改保存在单独的变更集中(甚至可能在单独的分支中)。我使用transplant、rebase 和strip 来移动更改。全部完成后,它们会被合并并正确推送。

    哦,检查MercurialQueues。我自己没有使用过它,但我看到它做了一些疯狂的事情。也许它能够按照你想要的方式做一些事情。

    【讨论】:

    • 我可以使用:hg rebase --collapse --keepbranches -b -d 似乎将所有更改的文件放在我的工作目录中而不提交它们。有副作用吗?
    • 除了最基本的东西,我没有使用 rebase,我建议你简单地阅读文档并在测试 repos 上彻底尝试以弄清楚它是如何工作的。顺便说一句,该评论是在 Stackoverflow 上提出的一个完全有效(且单独)的问题。 =)
    • Mercurial 确实有一个用于拆分变更集的扩展 - 它称为 histedit。您只需在编辑变更集时提交即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2012-06-09
    • 2012-02-07
    • 1970-01-01
    • 2011-01-13
    • 2023-04-10
    相关资源
    最近更新 更多