SVN:冲突解决 合并别人的修改

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

root@letuknowit:/home/kris/sally_calc/trunk# cat main.c
#include <stdio.h>
#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 testprintf("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.c
Transmitting file data .
Committed revision 7.

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

root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#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 testprintf("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.c
svn: 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 st
M       main.c
root@letuknowit:/home/kris/calc/trunk# svn st -u
M       *        6   main.c
Status against revision:      7

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

root@letuknowit:/home/kris/calc/trunk# svn up
Conflict 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:p
C    main.c
Updated 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 <stdio.h>
#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 testprintf("kris: 12 + 28 = %d.\n",add(12,28));
=======//sally's testprintf("sally: 60 - 33 = %d.\n",sub(60,33));
>>>>>>> .r7return 0;
}

你会看到由小于号、等于号和大于号串组成的三个部分,其中小于号和等号之间的内容是你的修改,而等号和大于号之间的修改是其他人的修改,在明确了冲突的原因之后,我们已经知道怎么修改了,两个人的修改都是需要保留的。
OK,那就保留所有的修改,删除掉<、=和>,最后的结果如下。
小于号、等于号和大于号串是冲突标记,并不是冲突的数据,你一定要确定这些内容在下次提交之前得到删除。

root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#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 testprintf("kris: 12 + 28 = %d.\n",add(12,28));//sally's testprintf("sally: 60 - 33 = %d.\n",sub(60,33));return 0;
}

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

root@letuknowit:/home/kris/calc/trunk# svn resolved main.c
Resolved 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.c
Transmitting file data .
Committed revision 8.

svn中的冲突解决看起来非常的复杂,实则很简单,只要掌握了原理,举一反三,就可以得心应手了!
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/svn-conflict-resolution
86%的同时也会看下面的内容:
SVN:修改已经提交的日志信息
svn checkout单个文件
导入文件到svn版本仓库
通过svn命令行忽略单个文件
svn changelist命令的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Error: Could not find or load main class

在 java 编程中如果遇到此错误&#xff0c;那么检查下 classpath。 必须确保把 .class 文件的路径添加到 classpath 中&#xff0c; 如果是在当前路径&#xff0c;那么就添加字符 . 到 classpath 中。注意不同系统环境下使用的路径分隔符是不同的&#xff0c;在 windows 下是分…

极客导航

评&#xff1a;集合产品技术与方案集合的方案 http://www.gogeeks.cn/job/2/Java%E5%B7%A5%E7%A8%8B%E5%B8%88转载于:https://www.cnblogs.com/jhj117/p/5779226.html

freemarker 分页逻辑

<#-- 分页组件需要传入的参数 pageUrl ,用来生成的html地址&#xff0c;在pageUrl中必须有{page}在生成html地址的时候会自动把页码给赋值上去。页码起始值为1pageNum 最大显示页 默认9beforPage 前显示页 默认3afterPage 后显示页 默认3countPage 总页数 必须传入curren…

linux上SVN解决冲突的办法

From: http://blog.csdn.net/bravezhe/article/details/7396151 工程师A修改了a.txt的第一行&#xff0c;提交了。 工程师B也修改了a.txt的第一行&#xff0c;然后执行svn up&#xff0c;这时SVN提示了&#xff1a;&#xff08;以下&#xff0c;你开始扮演工程师B的角色了&…

循环队列及C语言实现三

在之前的博客中给出了设计循环队列的思路以及源码&#xff0c;这些可都是经过我长期大数据测试的验证哦。当然&#xff0c;现在的很多开源项目和一些封装好的类或接口也都有类似的队列实现方法&#xff0c;之所以我还在使用自己写的这一套方法&#xff0c;主要是因为灵活性较大…

【转】提高PHP性能的53个技巧

PHP技巧汇总:提高PHP性能的53个技巧用单引号代替双引号来包含字符串&#xff0c;这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量&#xff0c;单引号则不会&#xff0c;注意&#xff1a;只有echo能这么做&#xff0c;它是一种可以把多个字符串当作参数的函数译注&a…

el-table列宽设置百分比无效;el-table使用min-width设置百分比;el-table百分比设置无效;

废话不多说&#xff0c;直接给每个el-table-column&#xff0c;设置 width"auto" min-width"25%"即可。 总的百分比还是要等于100%哈。 点赞收藏吧 感谢 代码可以直接复制使用&#xff1a; <template><div style"width:1300px;">&…

Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?...

http://blog.csdn.net/fhm727/article/details/5220003 1、什么是匿名内部类&#xff1f; 内部类&#xff0c;存在于另一个类内部的类&#xff0c;而匿名内部类&#xff0c;顾名思义&#xff0c;就是没有名字的内部类。 2、为什么需要匿名内部类&#xff1f; 每个inner clas…

VIM使用系统剪切板

在 Linux 终端模式下使用 vim 编辑器时发现经常需要在vim打开的文本文档进行复制粘贴&#xff0c;那么下面就跟着我的思路一步步往下走吧。 一、首先确认当前 vim 配置是不是支持系统剪切板&#xff0c;可以在终端模式下输入命令&#xff1a; vim --version | grep clipboard…

AndroidManifest.xml清单文件要点

AndroidManifest.xml AndroidManifest.xml清单文件通常包括如下内容&#xff1a; 应用程序的包名&#xff0c;该包名作为该应用的唯一标识。应用包含的组件&#xff0c;如Activity,Service,Broadcastreceiver和ContentProvider.应用程序使用系统所需的权限声明。其他程序访问该…

python操作Excel读写--使用xlrd

From: http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html 一、安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装&#xff0c;前提是已经安装了python 环境。 也可以在命令行执行&#xff1a;easy_install xlrd (注意权限) 二、使用介绍…

el-table自动充满,且无滚动条;el-table某列的列宽自适应,其他列按比例分配。

情景一&#xff1a;例如首列按照内容自适应展开&#xff0c;其余列有各自的比例。这样设置&#xff0c;就不会出现滚动条。 注意点&#xff1a; 给需要自适应展开的列加 :width"flexColumnWidth"计算方法 就可以自适应展开需要给余下所有的列都设置 width“auto” mi…

DataGridView控件中显示图片及其注意事项 【z】

windows Forms编程里面有一个DataGridView控件&#xff0c;它不光是可以显示数据&#xff0c;可以显示按钮&#xff0c;复选框&#xff0c;甚至还可以显示图片。这些图片可以来自于数据库&#xff08;用二进制的方式存储的&#xff09;&#xff0c;也可以来自文件系统。下面是一…

在winform上内嵌入其它的程序

这段代码很有意义,用于把一个程序的界面嵌入到我们自己程序的某个指定窗体上. 比如在某个项目里,我需要把基恩士的激光扫描轮廓显示给客户看,但是激光的DLL中并没有这种功能提供. 于是我想先启动激光的官方程序用以显示轮廓, 然后再把这种显示界面嵌入到我自己程序的界面上指定…

SPI总线时序

SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为PCB的布局上节省空间&#xff0c;提供方便&#xff0c;正是出于这种简单易用的特性&#xff0c;现在越来…

js计算浮点数出现小数;解决js计算小数问题;js数组相加出现小数;

原博1 原博2 方案1和方案2都是有效的 注意参数一定要是数字 而不能是字符串 否则会计算错误 情景&#xff1a; 在计算浮点数时候&#xff0c;出现多余小数。 例如&#xff1a; 1.11 1 2.1100000000000003 为什么计算小数会出现误差&#xff1f; 浮点数值的最高进度是17位…

Shell脚本中获取本机ip地址的3个方法

From: http://www.jb51.net/article/56585.htm 这篇文章主要介绍了Shell脚本中获取本机ip地址的3个方法,本文直接给出实现代码,需要的朋友可以参考下方法一&#xff1a; 复制代码 代码如下:/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk {print $2}|tr -d…

VMware安装系统时没有弹出分区设置

在安装虚拟机系统的时候&#xff0c;有时候会遇到在安装一些镜像时没有弹出分区设置的画面&#xff0c;比如&#xff0c;我在使用 VMware 安装 CentOS 的时候&#xff0c;在选择完镜像&#xff0c;设置好启动安装的时候系统自动为我划分了 3 个分区&#xff1a;/boot、/、swap分…

如何在postgresql中模拟oracle的dual表,来测试数据库最基本的连接功能?

还好&#xff0c;网上弄到的&#xff0c;&#xff0c;没有dual的数据库&#xff0c;可以试图用select函数不带from数据表的方式来实现返回值。 一段测试代码&#xff1a; try:conn psycopg2.connect(databasedb.service_name, userdb.username, passwordpassword, hostdb.ip, …

Linux 系统如何查看硬盘UUID与修改

一、查看 1. sudo blkid 2. ls -l /dev/disk/by-uuid 3. tune2fs -l /dev/sdb 二、修改与恢复 uuidgen 会返回一个合法的 uuid&#xff0c;结合 tune2fs 可以新生成一个 uuid 并写入 ext2,3,4 分区中&#xff1a; 比如新建或改变 sda5 的 uuid &#xff08;需要 root 权限…