从 SVN v1.5 开始,合并是逐个版本完成的。挑选要合并的区域会导致我们解决主干-分支冲突两次(将主干修订合并到 FB 时一次,合并回来时再一次)
那你做错了!
让我们看看:
trunk fb
---------\
r1-10 |
r11-20 |
r20-30 |
一般来说,如果你想在 11-20 完成更改,那么最佳做法是将 1-20 合并到 fb
把所有东西都拿到那里。
然后当fb完成后,合并20-30,然后复制 fb到trunk(不要合并!)。
如果您决定只合并 r11:20,好的,最后您需要合并 r1:10 和 r20:30
然后复制 fb到trunk。
您无法将更改合并两次!
我假设您可能会执行以下操作:
copy trunk->fb
merge 11:20 -> fb.
merge fb-1:30 -> trunk !!!!! WRONG
您不能这样做,因为您会合并两次 11:20。您应该始终将代码合并到
只有一个方向。
正确方法:
copy trunk->fb
merge 1:20 -> fb.
merge 21:30 -> fb (now fb=trunk+feature)
copy fb -> trunk
编辑
所以正确的步骤是:
-
从主干创建功能分支(FB)(使用 svn-copy 将主干复制到功能分支)
FB_0=trunk_0
-
在 FB 上工作。
FB_1=FB_0 + change_a
-
将所有即将发生的更改从主干合并到 FB。
trunk_1=trunk_0 + tr_change_a;
FB_2 = FB_1 + (trunk_1 - trunk_0) == trunk_0 + change_a + tr_change_a
-
在脸书上工作
FB_3 = FB_2 + change_b
-
将所有即将发生的未合并的更改从主干合并到 FB。
trunk_2=trunk_1 + tr_change_n;
FB_4 = FB_3 + (trunk_2 - trunk_1) == trunk_0 + change_a + change_b + tr_change_a + tr_change_b
-
此时我们有一个功能分支,其中包含所有新功能和
主干中的所有变化。所以我们只是复制两个分支之间的差异。
trunk_3 = trunk_2 + (FB_4 - trunk_2) = FB_4 = trunk_0 + change_a + change_b + tr_change_a + tr_change_b
现在 FB 被删除,因为 trunk 有我们需要的所有更改。
最后一步的执行者:
svn merge /path/to/trunk@LatestRev /path/to/branches/fb@LatestRev .
svn ci
或者用普通话来区分主干和分支并将它们放在主干
使它们等效。
http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.patterns.feature 中描述了这种模式
如果这对你不起作用,那么我不明白这个问题。
Edit2:对于 svn-1.5
在使用 svn-1.5 时,您可以更简单地合并:
当您在功能分支上工作时,您只需不时合并主干的更改:
$ svn merge /path/to/trunk
Solve conflicts
$ svn ci
它会将您的 FB 与主干中的所有更改对齐。在 FB 结束时,您运行此过程
再次确保一切都是最新的。你去后备箱跑
$ svn merge --reintegrate /path/to/fb
$ svn ci
在最后一个中,如果你按照所示工作应该没有冲突。