【问题标题】:How to merge only some files?如何只合并一些文件?
【发布时间】:2013-06-11 21:28:59
【问题描述】:

我正在尝试将部分提交从默认分支(不是所有文件和其他文件的一部分)合并到命名分支。我试过graft,但它只需要整个提交,而没有给我选择的机会。这将如何实现?

例子:

A---B---C---D
      \
       -E---(G)

G 尚不存在。假设CD 分别添加了5 个文件并修改了5 个文件。我希望G 将 5 个文件中的 2 个添加到 C,对其中一个文件的所有修改和对另一个文件的一个修改。理想情况下,我希望它也有来自D 的类似内容。

当我选择graft to local... 时,我得到的只是整个C 变更集。 merge with local...也一样

【问题讨论】:

  • 据我所知,Mercurial 本身不支持这种选择性合并。您可以做的是执行正常的合并,然后还原您不想合并的文件,并对您想要部分合并的文件进行手动更改。最后,提交合并。
  • @voithos 这是从一个分支到另一个分支修复错误的标准方法吗?我认为这将是一个常见且受支持的场景,不是吗?
  • 这不是标准的,甚至不推荐。当然,最佳实践要求错误修复应该是它自己的变更集,因此您不必挑选单个文件。如果是这样,您可以使用嫁接(或者只是合并,如果您在默认分支中只有错误修复)。

标签: merge mercurial tortoisehg


【解决方案1】:

合并的单元是一个完整的变更集,所以 C 和 D 应该被提交成更小的部分。您现在可以合并整个文件并还原一些文件,但这将导致您以后无法合并其余文件——它们已被视为已合并。

我要做的是创建一个与 C-D 平行的分支,在您的示例中以 B 为根,其中包含 C 和 D 中更改的副本,但将它们拆分为连贯的部分。然后,您可以从中合并整个变更集,并关闭(或者甚至删除)原始 C-D 分支。

      C---D
     / 
A---B--C1--D1--C2--D2    (equivalent to C--D)
     \   
      E---(G?)

在上面,C1 和 C2 一起等同于 C。当我这样做时,我继续并重新排序了四个新的变更集(使用历史重写工具,例如 rebase),这样您就可以简单地将 D1 与 E 合并:

      C---D
     / 
A---B--C1--D1--C2--D2
     \      \
      E------G

如果重新排序新的变更集不是一个选项,您必须做一些花哨的跳动以按 C1、D1、C2、D2 的顺序提交部分变更集;使用graft(或transplant)复制不允许单独合并的更改可能会少很多麻烦。例如,在下面你仍然可以合并 C1,但是你需要一个 D1 的副本(标记为 D1'),因为如果不拉 C2 就无法合并它。

      C---D
     / 
A---B--C1--C2--D1--D2
     \  \
      E--G1--D1'

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2011-11-06
    • 2019-09-12
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多