解决常见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. 解决方法: ...
随机推荐
- Linux : Linux命令
接触linux一段时间了,在网上搜罗了一些命令,以备后用.我有点爱上Linux了. 来自 :http://www.php100.com/html/webkaifa/Linux/2009/1106/34 ...
- error: declaration of 'cv::Mat R ' shadows a parameter
变量被覆盖. 例: void pose_estimation_2d2d::_pose_estimation_2d2d(const vector<KeyPoint> &v_keypo ...
- humans.txt学习理解
可以通过以下链接访问到Google的humans.txt https://www.google.com/humans.txt 百度上有关于humans.txt的介绍 http://baike.baid ...
- Swift3.0 键盘高度监听获取
方法:通过通知监听键盘的动态 1.键盘的动态有四种: public static let UIKeyboardWillShow: NSNotification.Name public static l ...
- 如何在内网打洞使得能暴露mstsc端口
说明: 1.目标机器Target,有全部控制权,其所处网络无法向外网暴露端口,但是已知Target的外网地址:Target_internet_addr 2.交换机器Exchange,有全部控制权,其所 ...
- [HNOI2010] 矩阵 matrix
标签:dfs+剪枝. 题解: 这道题看着就像一道dfs题目,没有什么算法可以用来算这个东西,于是想想暴搜. 如果我们确定因为是2*2的子矩阵的和,如果确定了其中三个,那么就可以确定第四个,发现如果确定 ...
- springboot与shiro和mybatis和mysql
测试项目已上传到GitHub:https://github.com/xiaostudy/springboot_shiro_test1 1.创建springboot项目 <!-- 数据库连接池 - ...
- 端口渗透·网站渗透过程 --21 ,22,873,3306,6379,8080(8080端口是针对CMS的渗透)
声明:文章渗透网站为模拟环境,文章只为利用过程 文章为信息收集和端口渗透两部分,21端口为ftp版本漏洞 8080端口为CMS的渗透 信息收集: ·使用扫描工具nmap ,PortScan 对整个网段 ...
- [NOIP2014]无线网站发射器选址
Description 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网.假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状, ...
- 17.TLB
我们只想读4个字节,但我们要经过如下的步骤 读取 字节的PDE 读取 字节的 PTE 读取 字节(int 占用4字节)的物理内存 在 10-10-12 分页模式下,CPU 每次要访问额外的访问 8 字 ...