Subversion 合并需要一些东西:
共同祖先
您认为这很简单,但这种情况经常发生。我见过开发人员会使用svn mkdir 创建一个分支,检查该分支,将文件从主干复制到该分支,然后执行svn add 将它们添加回。
虽然分支和主干具有相同的名称和相同的结构,但 Subversion 将它们视为两个完全独立的文件。树干和那个分支之间没有共同的历史。当然,开发者应该已经使用svn cp将主干复制到分支。
但是,您可以在较小的部分中遇到此类问题。想象一下,开发人员以正确的方式创建分支。然后发现项目中缺少一些*.jpg 文件。开发人员签出分支并添加文件。都照顾好了。现在,开发人员意识到主干上也存在相同的错误。没问题,结帐后备箱添加缺少的*.jpg 文件。
当然,主干上的*.jpg 文件与分支上的文件不同。开发人员应该将那些 *.jpgs 从分支创建的修订版合并到主干。
修订冲突
Subversion 不合并分支:它合并更改。这是一个难以理解的概念,但它赋予了 Subversion 很大的合并能力。
我在修订版 100 上从主干创建了一个分支。
分支的修订历史
- 100:已创建分支
- 103:错误修复 2001
- 110:将主干合并到分支
- 112:进行了更多更改
主干的修订历史
- 102:更改
- 104:错误修正 2001
- 111:更改
现在我想将我的分支合并回我的主干。如果我没有指定要使用的修订版,Subversion 会尝试找出我需要合并哪些修订版。我从来没有将我的分支合并到我的主干,所以 Subversion 看到我的分支和主干之间的最后一个共同祖先是修订版 100。然后它看到我需要将更改 103、110 和 112 合并回我的主干。
但是,我分支上的修订版 110 是我已经合并到我的主干的更改!如果我不小心,我会尝试将这些更改合并回我的主干中,从而导致冲突。
Subversion 应该可以处理这个问题,但并不总是那么干净。在运行合并之前,请执行以下命令:
$ svn mergeinfo --showrevs eligible $URL/branches/branch
这将显示 Subversion 想要合并到我的主干的修订。我应该查看该列表并确保这些更改尚未出现在我的后备箱中。
假设我查看了这个列表,发现这个符合条件的列表包含修订版 103、110 和 112。请稍等。修订版 103 修复了 Bug 2001,但这已经在主干上修复了。出于某种原因,还列出了修订版 110,修订版 110 是我的主干到我的分支的合并。我也不希望考虑这个修订。
我需要做的是通知 Subversion 不要考虑这些修订:
$ svn merge --record-only -c 103 -c 110 $URL/branches/branch
$ svn commit -m"Updating merge information to prevent collisions with 103 and 110"
现在,我再次运行svn mergeinfo --showrevs eligible,这两个修订版不会列出。我基本上已经通知 Subverison 这两套改动已经在我的后备箱里了。
您始终可以使用--dry-run 在完成之前尝试合并。如果您指定要合并的修订版,Subversion 合并始终有效。当您尝试让 Subversion 自行跟踪合并时,往往会出现问题。它肯定比以前好,但 Subversion 可能会与复杂的环境混淆。我们有一个项目重命名了分支,替换了主干,并在主干和其他两个分支之间进行了合并。 (不要问为什么。)。
开发人员无法进行合并,因为他们最终产生了数百个冲突。查看符合条件的修订,我能够清理混乱,并让合并工作。
记住要尽早并经常合并:合并的次数越多,合并就越有可能奏效,并且很容易发现任何冲突。尽量保持简单的合并活动。如果你在两个不同的分支上修复了一个 bug,你需要通过svn merge --record-only 让 Subversion 知道。
无论你做什么。不要惊慌。冲突会发生,如果你知道如何解决它们,你就可以避免合并地狱。