Subversion分支合并实用指南

8

前言

我知道在Stack Overflow上已经有很多关于合并SVN分支的问题。我已经阅读了其中许多问题,但仍然没有找到我要寻找的信息,请在提出将其视为重复内容之前,请完整地阅读这个问题。


我需要将一个 SVN 分支合并到另一个分支中。我对分支和合并的理论非常熟悉,但是我一直在实践中进行合并时遇到困难,更具体地说,是在识别和解决冲突方面。我怀疑这个问题的根本原因是我不理解完成任务所需的工具,即 TortoiseSVN 和各种可用的可视化合并工具。

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

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

但实际上我看到的是:

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

这使我想知道在每次解决冲突时如何查看合并结果。我还很难实际执行此类操作,例如接受分支 A 或 B 中的特定更改。阅读更多关于这个主题的内容之后,现在似乎基础修订版才是应该显示合并结果的地方,这是正确的吗?

我认为使用 TortoiseSVN 和可视化合并工具合并分支的屏幕录像或视频教程可能会回答我关于如何有效使用这些工具的大部分未解决问题。我更感兴趣的是解决冲突的过程,而不是执行合并本身,但如果两者都介绍那就更好了。

3个回答

5
实际上,有两种和三种合并工具。两种应该显示三个窗口:源分支版本A、目标分支版本B和合并结果。三向合并将额外显示基础版本。你可以像算式一样将三向合并想象为结果=目标+(基础-源)。实际上,算法将计算基础和源之间的差异集合以及基础和目标之间的另一个差异集合,然后删除两者共同的所有差异。然后,它将向您显示剩余差异的列表供您决策。对于源或目标中的差异,在另一个分支未受到影响的相同代码部分,它会自动预先决定使用适当的差异。如果差异在两个分支的相同代码部分,则标记为冲突,并且您的工具通常会逐个引导您解决冲突。冲突没有被预先决定,直到您做出决策,代码才会出现在结果文件中。您可以选择跳过下一个差异或下一个冲突。所有冲突都必须由您决定。根据您的知识,有时您希望回滚(重新决定)甚至是非冲突的差异来完成合并。
因此,合并文件的过程基本上是逐个查看差异或加快速度,只浏览冲突的差异,并决定采用源分支更改、目标分支更改还是编辑相关代码以创建新的合并更改。您所做的更改应该出现在结果窗口中,一旦您解决了所有冲突,工具应该允许您保存结果,然后将其作为目标分支上的新版本。基本文件的窗口通常仅用作既没有源分支更改也没有目标分支更改的版本的参考。
一些工具允许所谓的自动合并。如果没有冲突的差异,则工具将使用预先确定的差异解析,而不会问您任何问题。从字面上看,这些更改并不冲突,但它们可能在其他方面冲突。生成的代码可能无法编译或逻辑上不正确。但没有合并工具可以决定那个。这就是为什么合并结果应该由人阅读和审查,然后通过测试套件进行编译和运行,再提交到目标分支的原因。

3
您可以安装KDiff3来执行与TortoiseSVN的三方合并。它会自动集成到Windows平台上的TortoiseSVN中。
它显示给您的三个文件是两个分支的共同祖先,来自分支A的文件和来自分支B的文件。然后,您将冲突解决为代表您正在合并到的分支的文件。
我发现它是一个非常智能的工具,在普通情况下会自动选择合并简单冲突的正确选项。
当它不确定时,它会询问您该怎么做。
我偶尔遇到过它选择错误的情况。那些情况下,分支/合并路径相当复杂。
正如GrayWizard所说,有时候查看原始文件会更容易。Subversion会在您正在合并到的分支中生成一个带有标记的单个原始文件,显示哪些修改来自哪个版本。有一两次我需要在我的IDE中打开该文件并从那里进行修复。

KDiff3是执行合并时必备的工具。 - Brian Neal

1

Perforce有一个合并工具,可以显示所有四个版本(基础、A、B和合并),并以可视化的方式展示您的合并结果。

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

另外一个我见过的做法是导出一个工作集的副本,然后使用并排工具(如Beyond Compare)手动合并,然后直接进行检入。

关于合并的唯一让我困惑的事情是,它们与我预期发生的相反。这总是让我在基础修订方面遇到问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接