解决常见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
解决常见SVN冲突问题(转)的更多相关文章
- svn冲突文件解决方法
svn冲突文件解决方法 工具/原料 svn客户端 方法/步骤 1 通过SVN客户端更新需要的文件,如果出现有感叹号的文件,找到出现感叹号的文件. 2 选择感叹号文件,即冲突文件,单击鼠标右键对冲突文件 ...
- 【转】svn冲突问题详解 SVN版本冲突解决详解
(摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲 ...
- svn冲突的解决
svn文件冲突的解决 冲突后,会产生三个多余的文件. ①文件名.扩展名.mine 这是你的文件,在你更新你的工作副本之前存在于你的工作副本中--也就是说,没有冲突标志.这个文件 除了你的最新修改外没有 ...
- eclipse svn 冲突解决
eclipse svn 冲突解决
- tortoise svn冲突解决
Tortoiese svn 冲突解决 当文件被别人修改并提交到SVN服务器后,如果自己本地的文件没有被更新为最新的版本,而且已经做了修改,这时候提交将会被成功,系统会提示你的版本已经过期,并要求你先进 ...
- Tortoise svn 冲突解决主要办法
Tortoise svn 冲突解决主要办法 1.先备份自己的修改文件后,然后revert自己的更新内容,然后提交,再以更新后的代码为基准,将备份的代码移入进来.在这种方式下不需要使用svn resol ...
- svn冲突问题详解 SVN版本冲突解决详解
svn冲突问题详解 SVN版本冲突解决详解 (摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svn ...
- SVN学习总结(2)——SVN冲突解决
在我们用VS进行项目合作开发的过程中,SVN的提交控制是至关重要的,大家不可避免的都遇到过SVN冲突的问题,开发的时候,应该认真学习SVN的知识,减少冲突,集中时间放在开发上. 解决冲突有三种方式: ...
- SVN冲突
svn冲突,导致工程打不开,报错:xxx..xcodeproj cannot be opened because the project file cannot be parsed. 解决方法: ...
随机推荐
- MTK touchscreen 流程
1. kernel-3.18/drivers/input/touchscreen/mediatek/tpd_common_probe.c static int __init tpd_probe_ini ...
- vim vi Ubuntu 设置
1. 在vi编辑模式下按退格键不能删除内容,按方向键不能上下左右移动?如果是则:一 在vi里非编辑模式下按冒号进入到末行命令模式,然后输入set nocompatible,回车,然后在进入vi编辑模式 ...
- 从使用os.system)在python命令(重定向标准输入输出
从使用os.system)在python命令(重定向标准输入输出 python 标准输出stdout stdio os.system通常我可以通过改变sys.stdout的值在python更改标准输出 ...
- dubbo 使用 filter 报错解决
dubbo可以用filter实现类似tomcat filter过滤器. 实现1.接口请求时间监控. 2.打印输入输出日志(输出日志有应用自己决定) 配置时出现报错. No such extension ...
- 【221】◀▶ IDL GUI 函数说明
参考:GUI - Dialogs Routines参考:GUI - Widgets Routines参考:GUI - Compound Widgets Routines 01 DIALOG_MES ...
- 5、html的body内标签之多行文本及下拉框
一.多行文本 <textarea name="">默认值</textarea> 二.下拉框 1.单选 <select name="city& ...
- linux tar命令及解压总结
把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其 ...
- SqlServer规则
定义:规则时单独的SQLServer对象,可以关联到一个或几个表中的一列或几列.它可以使用多种方式来完成对数据值的校验,可以使用函数返回验证信息,也可以使用关键字BETWEEN,LIKE和IN完成对输 ...
- Linux locate 文件搜索
在学习 兄弟连 linux教学视频 的时候,我将所学的 linux 命令记录在我的博客中,方便自己查阅. 文件处理命令:locate 基础的命令 命令名称:locate 命令的所在路径:/usr/bi ...
- [Xcode 实际操作]八、网络与多线程-(10)使用异步Get方式查询GitHub数据
目录:[Swift]Xcode实际操作 本文将演示如何通过Get请求方式,异步获取GitHub资源的详细信息. 异步请求与同步请求相比,不会阻塞程序的主线程,而会建立一个新的线程. 在项目导航区,打开 ...