环境
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 # 导出代码到本地,方便后文演示
四种合并模式
注:下文都是以从主干创建了分支作为前提进行描述。
sync merge | 同步合并;创建分支后修改了主干,需要将主干的修改同步到分支时使用 |
cherry-pick merge | 选择合并;将指定的某一次或多次修改合并到目标 |
reintegrate merge | 重聚合并;分支任务完成,需要将分支的修改合并到主干时使用,完成后删除分支(很多翻译为复兴,我觉得重聚好一点,分支使命完成并与自己的源头重新聚合到一起) |
2-URL merge | 合并两棵不同的树;对比两个url的不同,然后将不同合并到指定目标,这三者可以是完全不同的树,可以没有任何关系 |
命令行合并的命令是 svn merge ... ,有一个参数 --dry-run ,任何合并都可用,作用是只模拟合并而不是真正合并,每次合并前先模拟一次是个好习惯。
同步合并
用法: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 r10Shell> 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
来源:https://www.cnblogs.com/toSeek/p/12176215.html