在这篇总结 版本管理-SVN冲突爆红后如何通过颜色和快捷键准确无误地合并代码(一)中,我们讨论了SVN不会引发合并冲突和可能冲突的场合,借助一个简单的文件,一行代码有冲突,阐述了如何通过颜色和快捷键快速解决冲突,合并文件。然而,显示项目和产品开发中,引发的冲突不会这么简单,往往都是一大片爆红,黄色,橙色,灰色,绿色,一下映入眼帘,这个时候,我们如何保证快速且准确无误地完成代码合并,进而完成开发任务,再也不为SVN的冲突头疼呢?
下面借助一个接近项目的复制的冲突例子,详细地解释如何应用SVN可视化解决冲突窗口,快速合并代码。
wsx 在文件IMRoot 中做又做了一些修改,并将这些修改提交到了SVN版本库。而qaz 在wsx 修改的这段时间呢,也对这个文件做了修改,等他修改完成准备提交的时候,冲突出现了,如下图所示,为了更加好理解解决冲突的可视化窗口,给出的颜色提示,我们如何利用它们解决冲突,合并代码。
冲突后的3个子视图 左上视图(版本库) 右上视图(qaz 想要提交的本地工作副本)左上视图与qaz 本地工作副本中同一个名称的文件发生了冲突。我们从第8行的下一行开始分析,显示为橙色,并且上方左、右两个窗口都显示相同,它们前面都有个2个小绿条,在下方的合并窗口中看到此行也为相同内容,但是前面是个蓝色的减号。多次实践表明,这表示上一版本中的内容,如果未右键点选此行的话(不明白请看系列一),它是不会合并到最终文件中。
继续向下看便是一片爆红区域,也是所谓的冲突区域,重点关照,左侧(版本库)中第9行~15行,与本地副本(qaz 想提交的)第9行~12行发生冲突,这里有人会问,为什么不是第9行~15行即为什么不是一行一行的比较,可以估计这是SVN的智能比较算法,它会比较上下文,所以导致错行现象,幸好这不是我们考虑的重点。
第9行左右两侧都是一样的,任意选择一行,右键点击use this text block ,第10行内容有区别,假如想要右侧窗口行,那么我们右键选择use this text block ,合并视图(下方窗口)第10行立即变为浅绿色,表示第10行的冲突解决掉了。
继续,我们想要左侧窗口的第11行~14行,此时我们选中这几行,右键也是选择use this text block ,同样下方合并窗口颜色变浅绿色。准备解决第15行,此时我们想要右侧窗口的第12行,即如下这行代码,
public interface IMRoot:IClonable 1 1但是我们刚才那种操作已经舍弃它了,选择了左侧的第12行了啊,这该怎么办呢?哦,原来还有一招,右键菜单还有一个选项use theirs before mine,这样我们在左侧窗口选择第12行,然后点击这个按钮,现在的视图变为以下这样,
左侧选择第12行然后点击 use theirs before mine 的效果此操作后,右侧窗口的第12行自动合并到文件中了,此时下方合并窗口,已经合并到第15行。
合并到第15行在下方的合并窗口中点击下冲突的第16行,对照着左上的第15行,这不是我们想要的,果断选择右方的对应行,合并后视图如下:
按照同样的方法,我们继续解决第17行~22行的冲突,全部选择上方的左侧区域行,
合并后的视图如下,
合并到第22行这样冲突就都解决完了,以上基本涵盖了项目中遇到冲突后常规的解决办法。是不是这样就完美解决冲突,代码不会有任何问题了? 未必!请看合并后的代码,我们发现,怎么在第22行和32行出现了两个相同字段DateLength呢?这是为什么呢?
我们来看下SVN自动如何将两个文件比较然后合并的,上方左侧窗口有个灰色区域,灰色表示与右侧相比缺少代码,并且不冲突,SVN遇到这种情况,会默认将缺少的合并到本地库(qaz)中。我们知道,橙色不会进入合并文件,但是黄色区域会进入合并文件的。如果默认这样的话,我们便找到了合并后出现2个相同的DateLength字段的原因了!
大家注意看,在以上解决冲突时,我们已经将这个字段DateLength合并到第22行了,所以这样合并会发生使这个字段重复定义两次。
解决这个问题,要么当时合并仔细对照了,要么便是编译代码才能发现,有可能也很难发现的。为了杜绝这种情况,我们尽量同一个人只改同一个文件,如果实在涉及到了多个人修改,我们最好是个别行的冲突,最好杜绝这种一大片的冲突,出现这种情况,往往便是多个人对同一个文件出现了非常大的修改才会导致的。
合并后文件,SVN版本库文件,想要合并到SVN中的文件单独放到附录中: http://blog.csdn.net/daigualu/article/details/68953332
(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(′\n′).length;var numbering = $(' ').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append( numbering); for (i = 1; i