解决常见SVN冲突问题(转)

转自:http://www.w3cfuns.com/blog-5443287-5403523.html

一个大项目在开发中可能会拆分成几个小项目,分别分去,同时共通的部分再由人做,做完后再统一合并。同时,在开发中,共通的部分修改后,其它人要保持同步。
        
        在这个开发过程中我们就需要用到svn去管理我们的的代码,可是在使用过程中,我们经常可能遇到各种各样的冲突问题,相当的头疼郁闷……,严重影响开发的工作效率
        
        在做总结之前我们先搞清几个概念和规则:
        ①利用svn checkout,upade、merge下来的代码本地,无论你如何操作及时产生冲突,也不会造成主干上面的代码混乱冲突。(记住本地产生冲突,还原到上一个版本就行了,一定不要提交到主干导致主干出问题)
        ②本地代码有冲突一定不可向主干提交代码,解决好了再提交
        ③merge合并代码时,是分支或者主干跟本地的代码进行合并(这个概念一定要理解清楚),出现问题不要慌,大不了重新来过,反正只是本地操作而已
        ④创建分支是可以直接命令branchs/tag或者在trunk Copy to        分支,切勿直接拷贝文件
        ⑤养成开发时将(switch)切换到主干(trunk)创建分支(branchs),上线时切换到主干合并(merge)分支,保持主干的准确性
        


        由于使用svn的过程中遇到的种种坑,对解决冲突问题做一下总结:

        一、svn 提交代码遇到的冲突问题
        
        1. 如果执行svn commit命令时遇到了"xxx is out of date"提示,如下图所示:

        

        那么一般是因为您修改了本地某文件或目录结构,而别人也修改了同一个的文件或目录并且先于您提交到了SVN库。 

        2. 解决的办法是先使用svn update命令获取SVN库上最新修改的文件,这个命令并不会直接覆盖掉您本地所做的修改,SVN客户端会先尝试将SVN库上该文件的修改合并到你的本地文件中。

        如果SVN客户端成功的进行了合并,您可以再次执行SVNcommit命令进行本地文件的提交即可。 

        3. 如果SVN客户端无法进行自动合并(可能因为文件是一些二进制文件,或者两人修改的地方是同一个,或者修改的地方太多等原因),则svn客户端会提示“one or more files are in confict state(遇到这样的英文,就头疼了)”,即告诉您有文件发生了冲突,如下图所示:


        4. 如果是文本文件冲突,则在文件夹下会多出几个冲突文件,如下图所示:
        

        其中:
        -f2是尝试合并的文件,里面有svn客户端加入的一些标记;(这个文件是,合并的文件,里面有注释标记,告诉你那里出现了冲突)
        -f2.r69是您本地修改文件的基础版本,69是版本号;(这个文件时你这个版本的问题,注意,是你没有做更改的版本)
        -f2.mine是您本地修改后的文件,即f2.mine是在f2.r69文件基础上更改的(这个文件时你现在本地改完的版本);
        -f2.r70是服务器上最新版本的文件,即别人修改后提交的文件。(这个文件是线上的最新版本)        


        此时的解决方法有多种:
        (1)比较f2.r70和f2.mine,将您自己做的修改和别人做的修改手工合并,可以下载一个Beyond Compare 比较文件不同,手动做更改,然后把合并后的内容覆盖到f2中。
        最后右键点击f2,然后选择Resovled,之后f2.mine,f2.r69,f2.r70文件都会自动被删除。然后您再次执行svn commit就可以了。如下图所示:

        
        (2)如果要保留别人的修改而放弃自己的修改,则可以删掉f2,f2.mine, f2.r69,f2.r70几个文件,再执行以下update,这样会重新从服务器上把最新文件下载到本地。

        (3)如果是保留自己的修改而放弃别人的修改,则可以删掉f2,f2.r69,f2.r70,然后把f2.mine改名为f2,然后再次执行svn commit,就可以把自己的修改上传到svn服务器。

        5. 如果发生冲突的是二进制文件,此时SVN客户端是无法执行自动合并的,这样目录下只会多出以.rXX结尾的两个文件,而不会出现.mine结尾的文件,此时的处理方法可以参考上面的(2)(3)。


        二、svn 合并分支时遇到的冲突问题
        
        svn 合并分支时,svn后台基本上可以理解成进行了2种操作:①增加本地没有的文件 ②合并本地已有但不同的文件 
        
        1.增加本地没有的文件,并不会造成冲突

        2.合并本地已有但不同的文件 ,如果单单是update就不会造成冲突,一旦出现update不了,svn无法自动识别合并,就会出现conflict冲突,这就蛋疼了。

        针对合并出现的冲突问题,把整个合并过程也图文并茂的讲解一下:



        从主干 ( trunk ) 合并至分支 ( branches) 通常选第 1 个,也就是 [Merge a range of revisions],这个菜单也是我们合并时用的最多的
        
        注意:其实也可以理解为把另一个分支合并到当前分支,这里就相当于把主干当成当前分支,有的版本比较高的svn可能就还有另一个菜单如图所示[Reintegrate a branch],其实它才是在当前分支下,将分支合并到主干的快捷操作,合并完成之后,我们可以删除分支,最后还是推荐大家用第一种 [Merge a range of revisions]
        
        
        

        在 Merge 的窗口有以下注意事项:
        1.合并的来源,由于我们打算从分支 ( branches ) 合并至主干(trunk),所以合并的來源要选 branches /2015.01.07才对!
        2.合并的结果会直接与目前「工作目录」(Working Copy) 做比对,并修改目前工作目录中的所有文件。因此建议在做合并之前可以将所有尚未 commit 的档案先 commit 到版本库,避免不必要的冲突事件发生。
        
        
        如图,可以看到的集中操作,add update没有冲突产生, svn自动合并不了了就会产生冲突

        

        3.当我们点击Edit conflict

        

        在冲突的文件上(选中文件--右键菜单—TortoiseSVN—Edit conflicts(解决冲突)),出现如下窗口

        Theirs窗口为服务器上当前最新版本
        Mine窗口为本地修改后的版本
        Merged窗口为合并后的文件内容显示

        如果要使用服务器版本,在Theirs窗口选中差异内容,右键,选择Use this text block(使用这段文本块)。
        同理如果要使用本地版本,在协商后,在Mine窗口右键,选择Use this text block(使用这段文本块)。


        4、  修改完成后,保存文件内容,提交即可。

        5、  如果另一个用户的冲突目录下,则可选中文件--右键菜单—TortoiseSVN—Resolved(解决)。会列出冲突的文件列表,如果确认已经解决,点OK。


        最后,给大家一些使用svn的建议:

        如何降低冲突解决的复杂度:

        1、当文档编辑完成后,尽快提交,频繁的提交/更新可以降低在冲突发生的概率,以及发生时解决冲突的复杂度。

        2、在提交时,写上明确的message,方便以后查找用户更新的原因,毕竟随着时间的推移,对当初更新的原因有可能会遗忘

        3、养成良好的使用习惯,使用SVN时每次都是先提交,后更新。每天早上打开后,首先要从版本库获取最新版本。每天下班前必须将已经编辑过的文档都提交到版本库。


        参考资料:
        http://blog.sina.com.cn/s/blog_5f54f0be0101f04y.html
        http://blog.csdn.net/windone0109/article/details/4857044
        http://wiki.open.qq.com/wiki/faq/SVN%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

一张网页,要经历怎样的过程,才能抵达用户面前? 一位新人,要经历怎样的历练,才能站在技术之巅?
原文地址:https://www.cnblogs.com/zdfjf/p/5075721.html