【问题标题】:Practical guide to Subversion branch mergingSubversion 分支合并实用指南
【发布时间】:2009-12-18 04:42:26
【问题描述】:

前言

我意识到已经有很多关于在 StackOverflow 上合并 SVN 分支的问题。我已经阅读了其中的许多内容,但仍然没有真正找到我正在寻找的信息,因此请在建议将其作为副本关闭之前完整阅读此问题。


我需要将一个 SVN 分支合并到另一个。我对分支和合并的理论非常满意,但我一直在为执行合并的实践而苦苦挣扎,更具体地说,是在识别和解决冲突方面。我怀疑这个问题的根本原因是我对完成工作所需的工具缺乏了解,即 TortoiseSVN 和各种可用的可视化合并工具。

根据阅读各种相关的 Stack Overflow 问题,我已将 Sourcegear DiffMergeBeyond Compare 确定为执行三向合并的候选工具。我尝试了 DiffMerge,但很难有效地使用它。我希望在解决冲突时看到以下三个文件

  • 来自分支 A 的文件
  • 来自分支 B 的文件
  • 执行合并的结果

但我看到的是

  • 来自分支 A 的文件
  • 来自分支 B 的文件
  • A 和 B 的共同祖先,AKA 基础修订版

这让我想知道,当我在视觉上解决冲突时,我如何在执行每个操作后查看合并的结果。我也很难实际执行这样的操作,例如,接受来自分支 A 或 B 的特定更改。在阅读了更多关于该主题之后,现在似乎基本修订实际上是合并结果的地方应该显示,对吗?

我认为演示如何使用 TortoiseSVN 合并分支和可视化合并工具的截屏视频或视频教程可能会回答我关于如何有效使用这些工具的大部分未解决的问题。我对解决执行合并本身的冲突的过程更感兴趣,但如果两者都被涵盖,那就太好了。

【问题讨论】:

    标签: svn tortoisesvn diff branch merge


    【解决方案1】:

    实际上,有二路和三路合并工具。双向应该显示三个窗口。源分支版本 A、目标分支版本 B 和合并的结果。除此之外,三向合并将显示基本版本。您可以将三路合并排序想象为 Result = Target + ( Base - Source ) 的方程。实际上,该算法将计算基础和源之间的一组差异以及基础和目标之间的另一组差异,然后删除两者共有的所有差异。然后它将向您显示剩余差异列表以供决策。对于源或目标中的差异,如果同一部分代码在另一个分支中不受影响,它将自动预先决定使用适当的差异。如果差异位于两个分支的同一段代码中,差异将被标记为冲突,您的工具通常会引导您一一解决冲突。冲突不是预先决定的,在您做出决定之前,代码不会出现在结果文件中。您可以选择跳到下一个差异或下一个冲突。所有的冲突都必须由你决定。根据您的知识,有时您想回滚(重新决定)甚至是不冲突的差异以完成合并。

    所以合并一个文件的过程基本上是遍历 diff 或者只通过一个一个冲突的 diff 来加速,然后决定是更改源分支、更改目标分支还是编辑有问题的代码以创建一个新的合并变化。您所做的更改应该出现在结果窗口中,一旦您确定所有冲突,该工具应该允许您保存结果,然后它将成为目标分支上的新版本。带有基本文件的窗口通常仅作为参考显示为既没有源也没有目标更改的版本。

    一些工具允许所谓的自动合并。如果没有冲突的差异,该工具将使用预先确定的差异分辨率而不询问您任何问题。基本上自动从源分支和目标分支中获取所有更改。虽然从词法上讲,这些更改不会发生冲突,但它们可能仍会以其他方式发生冲突。生成的代码可能无法编译或逻辑正确。但是没有合并工具可以决定这一点。这就是为什么合并结果应该由人工阅读和审查,然后在提交到目标分支之前编译并通过测试套件运行。

    【讨论】:

      【解决方案2】:

      您可以安装KDiff3 以执行与 TortoiseSVN 的三向合并。它自动与 Windows 平台上的 TortoiseSVN 集成。

      它显示的三个文件是两个分支的共同祖先,来自分支 A 的文件和来自分支 B 的文件。然后,您将冲突解决到代表您要合并到的分支的文件中。

      我发现它是一个非常智能的工具,在正常情况下会自动选择正确的选项来合并简单的冲突。

      当它不确定时,它会问你该怎么做。

      我有时会遇到选择错误方式的问题。不过,在那些情况下,分支/合并路径相当复杂。

      而且,正如 GrayWizard 所说,有时查看原始文件更容易。 Subversion 将在您要合并的分支中生成一个原始文件,并带有标记,以向您显示哪些更改来自哪个修订版。我有一次或两次需要在我的 IDE 中打开该文件并从那里修复它。

      【讨论】:

      • KDiff3 是执行合并时必备的工具。
      【解决方案3】:

      Perforce 有一个合并工具,可以向您显示所有四个版本(基本、A、B 和合并),并且可以直观地向您显示合并的样子。

      在进行复杂的合并时,我实际上发现只查看原始文件(假设它不是字节数据)并自己比较修订片段很有帮助。如果您的合并非常复杂(即重叠合并、移动代码等),这可能是唯一的方法。

      我看到的另一件事是导出工作集的一个副本,然后使用并排工具(如Beyond Compare)手动合并,然后直接签入。

      关于合并的一件事总是让我感到困惑,那就是它们与我预期的结果相反。这总是给我带来基本修订的问题。

      【讨论】:

        猜你喜欢
        • 2016-05-29
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 2010-11-02
        • 2012-05-11
        • 1970-01-01
        • 2019-01-10
        相关资源
        最近更新 更多