Linux命令行操作SVN合并

环境

Centos 7

SVN 1.7

若需要部署SVN服务端,可以参考Centos7配置SVN服务端

将一个oa项目作为示例:

Shell> svn ls svn://localhost/oa
  branches/
  tags/
  trunk/
# 假设当前trunk刚刚发版,版本号是1.0,所以要打个1.0的tag,并创建一个修复bug的分支
Shell> svn cp svn://localhost/oa/trunk svn://localhost/oa/tags/1.0 -m '1.0 tag'
Shell> svn cp svn://localhost/oa/trunk svn://localhost/oa/branches/1.0-bug -m '1.0 bug branch'
Shell> svn co svn://localhost/oa  # 导出代码到本地,方便后文演示

概述

命令行合并的命令是 svn merge ... ,有一个参数 --dry-run ,任何合并都可用,作用是只模拟合并而不是真正合并,每次合并前先模拟一次是个好习惯。

合并有如下四种模式(注:下文都是以从主干创建了分支作为前提进行描述):

sync merge 同步合并;创建分支后修改了主干,需要将主干的修改同步到分支时使用
cherry-pick merge 选择合并;将指定的某一次或多次修改合并到目标
reintegrate merge 重聚合并;分支任务完成,需要将分支的修改合并到主干时使用,完成后删除分支(很多翻译为复兴,我觉得重聚好一点,分支使命完成并与自己的源头重新聚合到一起)
2-URL merge 合并两棵不同的树;对比两个url的不同,然后将不同合并到指定目标,这三者可以是完全不同的树,可以没有任何关系

合并的操作中经常需要查看修订版本号,常用的方法有:

Shell> svn log               # 查看所有提交记录
Shell> svn log -l 10          # 查看最近10条记录
Shell> svn log --stop-on-copy     # 查看分支创建以来的记录
Shell> svn log | grep <关键字> -C 5  # 输出内容中查找关键字,打印匹配行的前后5行内容

同步合并

用法:svn merge SOURCE[@REV] [TARGET_WCPATH]

在1.0-bug分支开发了一段时间后,由于某个原因trunk进行了一次或多次修改,现在需要将trunk的修改同步到分支,并且不能影响分支上已提交的bug修复,命令如下:

Shell> svn merge svn://localhost/oa/trunk oa/branches/1.0-bug/
Shell> svn ci oa/branches/1.0-bug/ -m '同步合并'

source后可接修订版本号(默认是HEAD),表示同步到指定位置,假设trunk进行了两次修改,版本号分别是r9、r10,那么:

Shell> svn merge svn://localhost/oa/trunk@r9 oa/branches/1.0-bug/  # 只同步到r9,r10的修改不会同步到分支

选择合并

用法:svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]

在标记了tag后,由于某个原因trunk进行了一次或多次修改,现在需要将trunk的某些必要的修改更新到tag,命令如下:

Shell> svn merge -c r10 svn://localhost/oa/trunk oa/tags/1.0/  # -c 指定版本号,将r10的修改进行合并
Shell> svn merge -c r9,r10 svn://localhost/oa/trunk oa/tags/1.0/  # 可以逗号分隔多个版本号,将r9和r10的修改进行合并
Shell> svn merge -r r9:r10 svn://localhost/oa/trunk oa/tags/1.0/  # -r 指定范围版本号,将r9到r10的修改进行合并,注意这个范围不包含r9本身的修改,这个 -r r9:r10 相当于 -c r10
Shell> svn merge -c r6 -r r9:r10 svn://localhost/oa/trunk oa/tags/1.0/  # -c -r 可以一起使用
Shell> svn ci oa/tags/1.0/ -m '选择合并'

重聚合并

用法:svn merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]

当分支完成了自己的使命,不需要再保留时,需要将分支合并回trunk,此时就需要重聚合并;合并后就可以删除分支,若后续再有需求则应重建分支。

这种情况常见于功能性分支,功能开发完成即执行重聚合并,用于bug分支时表明结束对该版本的技术支持,后续不再修复bug了。

重聚合并前,为了减少可能的冲突,应该让trunk与分支处于同步状态,若创建分支后trunk进行过修改且未进行同步(或者说是有未同步的更新)则先进行一次同步合并,然后再重聚:

Shell> svn merge --reintegrate svn://localhost/oa/branches/1.0-bug oa/trunk/
Shell> svn ci oa/trunk/ -m '重聚合并'

source后可接修订版本号(默认是HEAD),表示合并截止到指定位置,但重聚肯定是要把分支所有修改合并,所以非常特殊的情况下才会需要指定REV。

合并两棵不同的树

用法:svn merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]

source1、source2、target三者可以是完全没关系的三个地址,所以这是最灵活的合并,其他合并能做的它都能做,不能做的它也能做(怀疑其他合并就是根据常用场景封装了这个合并吧?)。

灵活就意味着容易出错,所以还是建议优先用其他合并,若那些都无法满足要求再使用该合并方式。

比如,想把一个分支branch1相比于trunk的区别更新到另一个从trunk不同版本号创建的分支branche2,则命令如下:

Shell> svn merge svn://localhost/oa/trunk svn://localhost/oa/branches/1.0-branch1 oa/branches/1.0-branch2/
Shell> ci oa/branches/1.0-branch2/ -m '合并两棵不同的树'

source1、source2后面可接版本号(默认是HEAD),表示使用指定的版本进行对比。

 

over

posted @ 2020-01-10 17:34  晚来秋  阅读(3355)  评论(0编辑  收藏  举报