博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)SVN:冲突解决 合并别人的修改
阅读量:5931 次
发布时间:2019-06-19

本文共 4254 字,大约阅读时间需要 14 分钟。

hot3.png

在项目中,基本不可避免多个人同时参与一个项目,因此就可能会出现多个人同时修改一个文件的情况,就不可避免的会出现冲突。svn已经很聪明了,如果你和别人对于同一个文件的修改之间不存在重叠(比如你在文件最开始增加了一行,而你同事在文件的结尾出增加了一行),svn会自动将你们的修改进行合并,然而意外总是会发生,而且超出了svn的处理范围,只好采用人工智能(手工)来进行合并了。

要解决冲突,我们首先得制造个冲突,保证你现在已经有两个工作拷贝了,我们现在修改其中的一个,例如这里我们修改sally_calc中的main.c文件。

root@letuknowit:/home/kris/sally_calc/trunk# cat main.c#include 
#include "add.h"#include "sub.h"int main(){        printf("5 + 10 = %d.\n",add(5,10));        printf("15 - 10 = %d.\n",sub(15,10));        //sally's test        printf("sally: 60 - 33 = %d.\n",sub(60,33));        return 0;}

在这里sally增加了一个属于她自己的测试语句,改好后,提交到svn

root@letuknowit:/home/kris/sally_calc/trunk# svn ci -m "sally add some test code"Sending        trunk/main.cTransmitting file data .Committed revision 7.

下面回到kris的工作副本,做类似的修改,具体如下

root@letuknowit:/home/kris/calc/trunk# cat main.c#include 
#include "add.h"#include "sub.h"int main(){        printf("5 + 10 = %d.\n",add(5,10));        printf("15 - 10 = %d.\n",sub(15,10));        //kris's test        printf("kris: 12 + 28 = %d.\n",add(12,28));        return 0;}

好了,下面的工作自然是提交了。

root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"Sending        trunk/main.csvn: Commit failed (details follow):svn: File '/trunk/main.c' is out of date

很抱歉,提交失败了,原因是本地文件过期了(因为之前sally提交了对于main.c的修改)。原来如此,赶紧把sally的修改update过来。不过在这之前提供一个检测本地文件是否已经过期的办法,还记得经常用到的svn st命令吧

root@letuknowit:/home/kris/calc/trunk# svn stM       main.croot@letuknowit:/home/kris/calc/trunk# svn st -uM       *        6   main.cStatus against revision:      7

看到那个*了吧,出现这个标记就说明本地副本的文件已经过期了,需要执行svn update了。

root@letuknowit:/home/kris/calc/trunk# svn upConflict discovered in 'main.c'.Select: (p) postpone, (df) diff-full, (e) edit,        (mc) mine-conflict, (tc) theirs-conflict,        (s) show all options:

额滴个小心脏啊,又出错了,还要做选择题,纠结啊,纠结前还是看看各个选项都是做啥的吧

(p) postpone          暂时推后处理,我可能要和那个和我冲突的家伙商量一番(df) diff-full        把所有的修改列出来,比比看(e) edit              直接编辑冲突的文件(mc) mine-conflict    如果你很有自信可以只用你的修改,把别人的修改干掉(tc) theirs-conflict  底气不足,还是用别人修改的吧(s) show all options  显示其他可用的命令

这里我们先选择p稍候处理,系统会给出如下输出,main.c前面的C标识说明这是一个冲突中的文件,需要手工处理以解决冲突。

        (s) show all options:pC    main.cUpdated to revision 7.Summary of conflicts:  Text conflicts: 1

如果这个时候你查看一下工作拷贝,你会发现多了几个文件,对于每一个冲突的文件,svn会放置三个额外的未版本化文件到你的工作拷贝。

root@letuknowit:/home/kris/calc/trunk# ls -al m*-rw-r--r-- 1 root root 312 2012-09-20 16:35 main.c-rw-r--r-- 1 root root 216 2012-09-20 16:35 main.c.mine-rw-r--r-- 1 root root 156 2012-09-20 16:35 main.c.r6-rw-r--r-- 1 root root 218 2012-09-20 16:35 main.c.r7

其中main.c.mine是融合了你的修改的版本,里面是你更新的内容,main.c.r6是你做更新操作以前的版本,你是在这个版本的基础上做的修改,main.c.r7是版本库中的最新版本,这里有别人的修改,而就是这个修改和你的修改冲突了。这几个文件可以自己去查看下,应该很好理解。

对了,还有主角没有登场,这个时候如果你看下mian.c的内容,估计你又要郁闷了,和你原先的修改完全不一样了。

root@letuknowit:/home/kris/calc/trunk# cat main.c#include 
#include "add.h"#include "sub.h"int main(){        printf("5 + 10 = %d.\n",add(5,10));        printf("15 - 10 = %d.\n",sub(15,10));<<<<<<< .mine        //kris's test        printf("kris: 12 + 28 = %d.\n",add(12,28));=======        //sally's test        printf("sally: 60 - 33 = %d.\n",sub(60,33));>>>>>>> .r7        return 0;}

你会看到由小于号、等于号和大于号串组成的三个部分,其中小于号和等号之间的内容是你的修改,而等号和大于号之间的修改是其他人的修改,在明确了冲突的原因之后,我们已经知道怎么修改了,两个人的修改都是需要保留的。

OK,那就保留所有的修改,删除掉<、=和>,最后的结果如下。
小于号、等于号和大于号串是冲突标记,并不是冲突的数据,你一定要确定这些内容在下次提交之前得到删除。

root@letuknowit:/home/kris/calc/trunk# cat main.c#include 
#include "add.h"#include "sub.h"int main(){        printf("5 + 10 = %d.\n",add(5,10));        printf("15 - 10 = %d.\n",sub(15,10));        //kris's test        printf("kris: 12 + 28 = %d.\n",add(12,28));        //sally's test        printf("sally: 60 - 33 = %d.\n",sub(60,33));        return 0;}

冲突解决了,下面的工作就是通知svn,我们已经把冲突搞定了(使用svn resolved命令),下面该你了,可以看到svn将生成的几个临时文件删除了。

root@letuknowit:/home/kris/calc/trunk# svn resolved main.cResolved conflicted state of 'main.c'root@letuknowit:/home/kris/calc/trunk# ls -al m*-rw-r--r-- 1 root root 278 2012-09-20 17:07 main.c

接下来提交代码,搞定收工。

root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"Sending        trunk/main.cTransmitting file data .Committed revision 8.

svn中的冲突解决看起来非常的复杂,实则很简单,只要掌握了原理,举一反三,就可以得心应手了!

原创文章请注明转载于,本文地址:

转载于:https://my.oschina.net/mustang/blog/190103

你可能感兴趣的文章
axios 拦截 , 页面跳转, token 验证(自己摸索了一天搞出来的)
查看>>
有序的双链表
查看>>
项目管理学习笔记之二.工作分解
查看>>
Linux系统启动流程详解
查看>>
测试人员必学的软件快速测试方法(二)
查看>>
程序员全国不同地区,微信(面试 招聘)群。
查看>>
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
闭包 !if(){}.call()
查看>>
python MySQLdb安装和使用
查看>>
Java小细节
查看>>
poj - 1860 Currency Exchange
查看>>
chgrp命令
查看>>
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>