版本管理中有一个很重要的概念,就是主干和分支。对应于主干和分支之间代码的合并操作,就会用到svn merge。
svn提供了4种不同形式的merge方法,分别如下:
- merge SOURCE[@REV] [TARGET_WCPATH]
(the ‘sync’ merge) 同步合并 - merge [-c M[,N…] | -r N:M …] SOURCE[@REV] [TARGET_WCPATH]
(the ‘cherry-pick’ merge) 摘选合并 - merge –reintegrate SOURCE[@REV] [TARGET_WCPATH]
(the ‘reintegrate’ merge) 归源合并 - merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]
(the ‘2-URL’ merge) 双URL合并
我们逐个进行介绍
- merge SOURCE[@REV] [TARGET_WCPATH]
merge的第一种用法,就是最基本的合并方式。
首先从字面上解释一下,source指需要合并的代码源,TARGET_WCPATH指目标工作区间,这条命令的意思是把source的内容合并到TARGET_WCPATH。
再来解释一下merge的过程。在合并的过程中,svn会对两个路径下的文件夹、文件进行对比。
从根目录开始,source中的文件夹如果中TARGET_WCPATH找不到同名文件夹,则直接复制到TARGET_WCPATH;
如果找到同名文件夹,则文件夹内再依次深层比对,同名的再比对,不同名的复制,直到没有文件夹可以比对;
对于文件来说,文本文件会对文本内容进行合并;而非文本文件比如png、exe、gif等等,会产生冲突
注意命令中[]中括号中的内容,代表可以省略。
我们将这条命令省略为merge SOURCE[@REV],也就是说source可以合并代码到source。 @REV是Peg Revision,它用于定位某些被删除又重新建立的文件。具体可以参考http://svnbook.red-bean.com/en/1.1/ch07s03.html,这里不详述。
- merge [-c M[,N…] | -r N:M …] SOURCE[@REV] [TARGET_WCPATH]
第二种合并文档描述为cherry-pick(摘樱桃),我翻译为 摘选合并。它可以指定source的某些版本区间,在这些区间内的代码变更才进行合并。
-r 100:200 指source的版本100到200之间的代码。
-c可以算作-r的特殊用法,-c 200 等价于 -r 199:200,它指对比某个临近版本的代码变更。
在这个命令中,-c -r可以指定多个,所以它称为摘樱桃,就是选某些版本(樱桃)进行操作(来摘)。
- merge –reintegrate SOURCE[@REV] [TARGET_WCPATH]
第三种合并,我翻译为 归源合并。
它要求source是从TARGET_WCPATH中拷贝创建的,然后在某个版本将所有代码变更合并回TARGET_WCPATH。
在这次合并后,source的新的修改无法再向TARGET_WCPATH合并,也就是一次性的回到源头的合并。简直像是个魔法啊,哈哈
这里起到关键作用的就是–reintegrate选项。
另外注意,在归源合并中,不能指定版本区间-r或-c。
- merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]
the ‘2-URL’ merge,双URL的合并。
这个可以分为两部分进行理解:
diff SOURCE1[@N] SOURCE2[@M] ,对比这两个URL的区别,假设为diff1
将有区别的内容diff1,合并到TARGET_WCPATH
以上就是几种merge的用法介绍,
PS :实际上,对于svn来说并不存在主干和分支这样的模块,这是一个便于理解的虚拟概念,使大家中版本管理上有共同的描述形式。实际在使用merge时,只要是从一个工作区间到另一个工作区间,都可以进行合并操作。
在实际操作merge时,svn会对比需要merge的source和target的版本号,所以要注意一下版本号的情况。有的时候一直commit代码,但是没有update过,你的本地版本号是不会变的,直接合并就会有问题。