先来了解下什么是冲突吧。冲突就是代码 String str="aaaa" 被同时修改,一个要变成String str="bbbb";一个要变成String str="cccc";这就在代码合并的时候就带来了冲突。如果代码合并是从主干rebase到分支,如果出现冲突,都是以主干为准(以保证已有的功能不受到影响),就会出现主干代码强制覆盖分支的代码。出现冲突后有4个文件(以pom.xml文件为例):
1.pom.xml ———合并后的文件,如果有冲突会有<<<<<<<冲突提示符
2.pom.xml.merge-left.r1298 ———主干的前一个版本,也就是计算是否有冲突的根文件
3.pom.xml.merge-分支 ———本地分支的代码,也就是你要求rebase主干的分支代码
4.pom.xml.merge-来源.r1313 ———主干的代码
有些人认为解决冲突只要看1中的pom.xml中的冲突提示符就够了。然后对有冲突的地方一一解决就够了。如下图:
实际上只是看这个是远远不够的。有这样的一种情况。String str="aaaa",被同时修改,trunk上已经是String str="bbbb";本地分支又被修改为String str="cccc";另外一个变量 String str2 = "aaaa2";trunk上没有变化,只是本地分支被修改为了String str2="cccc2";这个时候svn会将这个文件视为有冲突,因为str 即想变为bbbb又想变为cccc,会计算为冲突。但是str2从冲突的定义上来看不是一个冲突,因为只有一个地方修改。svn在代码合并的时候,发现这个文件有冲突会直接用trunk的内容覆盖分支的内容,并且将str的地方打上冲突提示符。但是str2的地方就不会打上冲突标识符,因为它不是一个冲突。因此这个文件合并后就是这样的:
如果只是按照冲突提示符去合并就会出现本地代码丢失的场景。那么正确的合并冲突解决方法应该是什么呢?应该是根文件(上面提到的pom.xml.merge-left.r1298),分支文件(pom.xml.merge-分支),trunk文件(pom.xml.merge-来源.r1313)进行三方比较。比较工具我使用的是Beyond Compare 3。如下图所示:
从上图可以看出,真正出现冲突的是version1会打上冲突提示符,version是直接被trunk的覆盖。合并后的文件如下图:
合并冲突的时候应该对这三个文件进行三方比较,具体操作可以使用上面标红的直接定位。合并的时候一定要清楚那些是需要保留分支的,那些是需要保留主干的。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/186464.html