合并 svn 分支之间的更改

Merging changes between svn branches

背景

我们的服务器是运行ning subversion 1.8.10。我们的客户使用 1.8+。我们主要使用 TortoiseSVN(所以我将使用乌龟术语来描述),版本 1.8+。
我们的(常见的)颠覆工作流程是:

一切正常。

问题

我们遇到过 运行 的情况,比方说,BranchA 有一些变化(例如,添加了一些文件)。它是最新的(从 t运行k 开始)并在合并回 t运行k 之前通过代码审查。 BranchB 已创建(从 t运行k)并希望从 BranchA 获取更改以便从中构建。
如果我们从 BranchA 到 BranchB 进行 MRoR,我们将获得预期的更改。我们可以根据需要多次合并 BranchA,我们也可以从 t运行k 将 MRoR 合并到 BranchA 或 BranchB.. 一切看起来都很好。
BranchA 可以合并回 t运行k(使用 MTDT),工作正常。然而,一旦我们 MRoR t运行k 再次进入 BranchB,在 BranchA 的合并之后,我们得到树冲突。为什么是这样? SVN 正在跟踪合并历史,它可以看到 BranchA 是谁 created/moved/etc 个文件。如果我执行相同的过程,而是使用 MTDT 从 BranchA 合并到 BranchB,结果是完全相同的。即使 BranchB 没有自己的更改,这仍然会发生。

在 BranchA 合并回 t运行 之后,从 t运行k 到 BranchB 的下一个 MRoR 时,从 BranchA 合并到 BranchB 的正确方法是什么,这样就不会出现树冲突k?

这种事情在git中很容易做到。我确信应该有办法解决树冲突。

感谢您的帮助!

  1. 在深入之前,您必须自己修复工作流程中的弱点和错误:

    • 弱点:对于 SVN 1.8.*,具有相当好的智能合并跟踪步骤 3 可以|必须(任何时间)只是 'complete'合并(参见 svn help merge 表格。1)
    • 大错误:将功能分支合并到主干/子分支到父分支/不能(而且从来不是)两个-URL-合并(我什至可以想象一下你是怎么做到的):我建议你一遍又一遍地重新阅读帮助中的“重新整合合并示例”,而不是无数的单词
  2. AFAICR,即使 "circular" 的工作流程正确,有时也会合并 (A->B->C->A) 神秘的树冲突(TSVN 1.8.11 之前和之中)之前(您现在的体验可能有所不同)并完成了在 Mercurial 中合并分支(包括用 Mercurial 工作目录的内容替换 SVN-target 的 WC 的手工工作——Mercurial 可以与 SVN 双向交互,但仍然不能将自己的合并集推送到SVN-repo) 和手动编辑 SVN 中的 mergeinfo

我已经做了一些测试并弄明白了。我会继续分享如何做到这一点,以防更多人遇到同样的问题。
回顾一下:

  • BranchA 和 BranchB 存在(从主干分支)。
  • BranchA 有一些文件 added/renamed/moved/deleted/etc。
  • BranchB 已将 BranchA 合并到自身中(通过合并修订范围 (MRoR))。
  • BranchA 已从主干中获得 MRoR(因此它是最新的并准备好合并)。
  • BranchA 已合并(使用合并两棵不同的树 (MTDT))回到主干。
  • 如果 BranchB 尝试从主干中获取更改(使用 MRoR),将会出现树冲突。

当你仔细想想时,树冲突实际上是有道理的。从 BranchB 的角度来看,它从 BranchA 的合并中修改了一些文件,然后又从主干的合并中修改了一些文件。因此,树冲突。问题是来自主干的合并不会让 BranchB 知道 BranchA 已合并到主干中。 实际上有两种方法可以解决这个问题。

解决方案:

方法一(比较复杂的方法)

  1. 在 BranchA 已通过 MTDT 进入主干后,执行从主干到 BranchA 的 MRoR。 BranchA 现在包含主干的历史,post-BranchA MTDT。
  2. 执行从 BranchA 到 BranchB 的 MRoR。 BranchB 现在包含中继历史记录 post-BranchA MTDT。
  3. 从主干到 BranchB 的 MRoR。没有树冲突!耶!

方法二(更简单的方法)

  1. 在 BranchA 合并后的任何时候,做一个 MTDT from BranchA(@修订最后合并到 BranchB)to trunk(@任何修订 post-BranchA MTDT -- HEAD 都可以)进入 BranchB。
  2. 从主干到 BranchB 的 MRoR。没有树冲突!耶!

方法 2 更好的更多原因(除此之外它少了 1 个步骤)。

  • 方法 1 在合并分支后(每次)需要一个额外的步骤(步骤 1),使分支合并过程复杂化。
  • 同样,方法 1 需要提前完成步骤 1,跳过该步骤意味着方法 2 是唯一的救赎(为什么不首先使用方法 2?)。
  • 如果 BranchA 已被删除,使用方法 1,您必须找到 A 存在的最后修订(以执行步骤 2)。这可能会很痛苦。
  • 从方法 2 的步骤 1 中找到对 MTDT 的正确修订非常容易。只需检查 BranchB 的历史记录,它的最后修订版 BranchA 已被 MRoR。
  • 如果在 BranchA 的最后一次 MRoR 到 BranchB 和 BranchA 被 MTDT 进入主干之间进行了新的更改,方法 2 将考虑到这一点并仍然将所有必要的内容合并到 BranchB。

如果不清楚,就用方法二。
我知道这是一个有点高级的 SVN 工作流程。但是,我希望这个解释对遇到类似问题的其他人有所帮助。

TortoiseSVN合并策略来源: https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-merge.html