SVN MERGE 和冲突

时间:2022-05-21 02:23:29

摘要:最佳做法是避免冲突。冲突时,不要把branch merge到trunk. 先由最新版本的trunk得到branch,然后再修改文件,直接merge过去就行。这样不会有冲突。先用svn
merge --dry-run来模拟假装merge一下看是否有冲突

1 svn merge

# svn merge --help

merge: Apply the differences between two sources to a working copy path.

usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]

       2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]

       3. merge [-c M | -r N:M] SOURCE[@REV] [WCPATH]



我们以第一个为例

merge sourceURL1[@N] sourceURL2[@M] [WCPATH]

这个help里面提示,merge需要三个参数

sourceURL1,sourceURL2的含义并不是两个分支,或者一个分支一个主干,而是同一个分支的两个状态,或者说是两个版本。对这两个版本做一个diff,然后把diff的结果,应用到最后的参数WCPATH上,WCPATH代表是一个本地已经checkout的工作区



svn merge的思想是diff and apply



比如,我开发一个项目叫做proj

目录结构是

proj/trunk

proj/branches

proj/tags



(省略了http:// 之后的,只是相对路径,但是真正使用时候不能省略)



当版本达到100的时候,我决定做一个branch进行一些其他开发

 [Reversion:100]

 $svn cp proj/trunk proj/branches/proj_branch_1

 OK Reversion:101



然后,trunk和proj_branch_1都在开发,到了某一个版本,比如150,branch开发完成,需要merge回到trunk

此时的目录结构是

[Reversion:150]

proj/trunk

proj/branches/proj_branch_1

proj/tags



按照svn的实现,我需要知道proj_branch_1所做的所有的变化,也就是当前的状态对刚刚生成时候状态的变化。根据这个变化生成一个diff文件,在apply一个本地的工作区上。(建议是一个干净的本地trunk工作区)



那么执行

$cd proj/trunk

$svn merge proj/branches/proj_branch_1@101 proj/branches/proj_branch_1 .



其实,第一个URL(我们称之为左边),为起始状态,通过最后的@101,表示取版本101,这个101就是cp成功之后的那个版本。第二个URL(我们称之为右边),为最终状态,取最新的,

 左边和右边做了一个diff,应用到当前工作区目录,也就是trunk。

 此时

 $svn st就可以看到变化了



这里的一个问题是如何获取这个cp之后的版本,也就是例子中的101

可以使用svn log里面的--stop-on-copy命令

$svn log --stop-on-copy proj/branches/proj_branch_1

会到cp的时候停下来,那里边标注的版本就是需要的版本



 比如,这是一个真正项目的一个例子,

 ------------------------------------------------------------------------

 r995 | yinweiming | 2007-10-24 09:07:08 +0800 (三, 24 10月 2007) | 1 line



 Create a branch for proj client using

 ------------------------------------------------------------------------

 其中的r995,995就是我需要的版本

 (说明一下,commit时候写commet的好处,比如这里我就很明确的肯定这是branch的起始点)



对于svn merge的另外的用法也是类似,只要是明白了

他是根据左边,右边生成diff,然后应用到本地的一个工作区就容易理解了。



还有可以使用svn merge --dry-run来模拟假装merge一下,看一下merge会发生什么,而不是真正的做这个动作。





而对于merge的help里面的 3. merge [-c M | -r N:M] SOURCE[@REV] [WCPATH]

这个也很容易理解,就是取 SOURCE 这个东西,版本N,M之间的区别,作用在WCPATH这个本地工作区上



注意!

做branch千万别根据本地修改过的工作区做,一定基于某一个URL的版本做
我就吃过这个亏

diff的时候,diff不出来,因为基于本地工作区的,所以现在merge起来很是费劲

转自:http://www.blogjava.net/lingy/archive/2009/06/02/279544.html

2 svn resolve 解决冲突

svn resolve --accept  ARG  file

--accept ARG             : specify automatic conflict resolution source

                            ('base', 'working', 'mine-conflict',

                             'theirs-conflict', 'mine-full', 'theirs-full')

Resolve “conflicted” state on working copy files or directories. This routine does not semantically resolve conflict markers, however, it replaces PATH with
the version specified by the --accept argument and then removes conflict-related artifact files. This allows PATH to be committed again—that is, it tells Subversion
that the conflicts have been “resolved.”. You can pass the following arguments to the --accept command depending on your desired resolution:

base

Choose the file that was the BASE revision before you updated your working copy. That is, the file that you checked out before you made your latest edits.

working

Assuming that you've manually handled the conflict resolution, choose the version of the file as it currently stands in your working copy.

mine-full

Resolve all conflicted files with copies of the files as they stood immediately before you ran svn update.

theirs-full

Resolve all conflicted files with copies of the files that were fetched from the server when you ran svn update.

例子:

工程师A修改了a.txt的第一行,提交了。



工程师B也修改了a.txt的第一行,然后执行svn up,这时SVN提示了:(以下,你开始扮演工程师B的角色了)

$ svn up

在 “a.txt” 中发现冲突。

选择: (p) 推迟,(df) 显示全部差异,(e) 编辑,

(mc) 我的版本, (tc) 他人的版本,

(s) 显示全部选项:



我一般选择p(推迟),即引入冲突到本地,不过不会影响到SVN服务器端,可以放心。



OK,开始解决冲突了。



这时,会生成几个文件:



a.txt

 a.txt.mine  a.txt.r6328  a.txt.r6336



其中a.txt中包含了工程师A、B的所有修改,以<<<<<<<、=======、>>>>>>>分隔。



a.txt.mine是工程师B的修改,也就是未update前的a.txt。



a.txt.r6328 是工程师A提交前的版本,即未导致冲突的版本。



a.txt.r6336是工程师A提交后的版本,即导致冲突的版本。



一般,查看a.txt就可以看到冲突的详情了:



[yicheng@chengyi svntest]$ cat a.txt



<<<<<<< .mine



i also modify ,agndagnagasdg;



=======



i modify this line;



>>>>>>> .r6336



以上,<<<<<<< .mine和=======之间是工程师B(当前的“你”)修改的内容,=======与>>>>>>> .r6336之间是工程师A修改的内容。这时,最好的办法是,叫上工程师A,你们一起确定这些修改是否都需要,是否相互兼容,然后留下需要的部分,删 除<<<<<<< .mine、=======和>>>>>>> .r6336。



然后,测试,测试!确定没问题之后,就可以告诉SVN,你解决冲突了:



svn resolve –accept working a.txt (该命令会删除a.txt.mine  a.txt.r6328  a.txt.r6336)



svn ci -m ’some comment’ a.txt

SVN MERGE 和冲突的更多相关文章

  1. svn merge部分的详细说明

    http://blog.sina.com.cn/s/blog_620eb3b20101hvz7.html 解决版本冲突-使用SVN主干与分支功能 1  前言 大多数产品开发存在这样一个生命周期:编码. ...

  2. SVN merge

    SVN merge的主干,分支的相互合并操作   SVN merge的主干,分支的相互合并操作 本文只研究了 在本地如何进行主干,分支的相互合并 的操作:从主干到分支,从分支到主干. 本地客户端工具是 ...

  3. Egit的merge合并冲突具体解决方法

    稍微总结下弄了半个下午的egit的merge合并冲突解决方法,网上看的都是一个模板出来的,看的糊里糊涂,花了很多时间去实验整个合并流程.. 前提工作 创建一个普通JAVA工程Test,创建一个类Tes ...

  4. svn merge Property conflicts

    svn merge代码的时候,出现Property conflicts的解决方案.可以参考:http://*.com/questions/23677286/conflict-w ...

  5. svn上想回滚代码怎么办?——svn merge 命令

    小博客断更了很久,最近想接着尝试建立写作的习惯,把自己工作生活遇到的有用知识沉淀下来.尽管微信公共账号比较火,但个人觉得这种不能用搜索引擎检索的东西完全就是历史的倒退,就像 RSS 这种提高信息传播效 ...

  6. SVN代码提交冲突解决方案

    SVN代码提交冲突解决方案 1.若你的代码被其他人修改并提交过了,期间你自己也修改过该文件,UPDATE的时候自己代码被覆盖. 右键——>显示日志 查看该文件的更新记录 找到需恢复的版本 右键— ...

  7. svn merge 回滚

    聊一聊 svn merge 命令. svn 是啥就不用介绍了吧,谁用谁知道.有了 svn,开发者只要把代码提交上去,无论山崩地裂.电脑进水.硬盘格式化,哪怕换了一台电脑,都能随时把代码找回来.不过从自 ...

  8. svn代码回滚和合并的利器svn merge

    1.svn merge可以将两个对象的diff体现到本地工作目录上. (1)两个对象 这个两个对象可以是同一个svn url的两个revison,也可以是不用的url,比如分支和主干. (2)diff ...

  9. Eclipse svn代码提交冲突

    Eclipse svn代码提交冲突(转) 1.Synchronize视图下查看代码冲突 1.Incoming Mode 全部update,更新到本地2.Outgoing Mode 全部commit,提 ...

随机推荐

  1. 15 个有用的 MySQL&sol;MariaDB 性能调整和优化技巧(转载的一篇好文)

    MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...

  2. visual studio 局域网远程调试web项目

    1.进入项目根目录,找到.vs/config/applicationhost.config文件(可能是隐藏的) 2.搜索sites节点,找到当前项目,并添加一个binding配置节,将ip地址设置为本 ...

  3. Java Volatile关键字

    在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写. 这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量 ...

  4. How to use For loop in CruiseControl&period;net

    Looping through parameter values in Cruisecontrol.net Example >>>>>>>>>&g ...

  5. oracle 常用博客网址

    使用oradebug修改数据库scn – 提供专业ORACLE技术咨询和支持@Phone13429648788 - 惜分飞 Solaris上使用DTrace进行动态跟踪 老熊的三分地-Oracle及数 ...

  6. 小明系列问题——小明序列&lpar;Lis 相距大于d的单调上升子序列&rpar;

    小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  7. Centos7下安装docker(1)

    1.确认系统没安装任何docker相关的安装包 yum remove docker docker-common docker-selinux docker-engine centos7的docker存 ...

  8. sublime text3 安装package control 出现问题解决过程记录

    1.安装package control 失败 通过最简单的自动安装 package control 失败(详见package control官网). 报错展示: File "./python ...

  9. 第二章 深入C&num;数据类型

    深入C#数据类型       巧记:值(无ref)+值=不变 值(无ref)+引=变     引(有ref)+值/引=变     1.值类型和引用类型 1.引用类型 源于system.object家族 ...

  10. 【RF库测试】set variable if