[技术| 编程·课件·Linux] 简要理解svn merge的几种用法

admin · 发布于 2017-09-27 13:09 · 880 次阅读
1
  版本管理中有一个很重要的概念,就是主干和分支。对应于主干和分支之间代码的合并操作,就会用到svn merge。


  svn提供了4种不同形式的merge方法,分别如下:
  1. merge SOURCE[@REV]
  [TARGET_WCPATH]
  (the 'sync' merge)  **同步合并**
  2. merge [-c M[,N...]
  | -r N:M ...]
  SOURCE[@REV]
  [TARGET_WCPATH]
  (the 'cherry-pick' merge)  **摘选合并**
  3. merge --reintegrate SOURCE[@REV]
  [TARGET_WCPATH]
  (the 'reintegrate' merge)  **归源合并**
  4. merge SOURCE1[@N]
  SOURCE2[@M]
  [TARGET_WCPATH]
  (the '2-URL' merge)  **双URL合并**




  我们逐个进行介绍


  1. 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,这里不详述。
  

      2. 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可以指定多个,所以它称为摘樱桃,就是选某些版本(樱桃)进行操作(来摘)。


  3. merge –reintegrate SOURCE[@REV]  [TARGET_WCPATH]
  第三种合并,我翻译为 归源合并。
  它要求source是从TARGET_WCPATH中拷贝创建的,然后在某个版本将所有代码变更合并回TARGET_WCPATH。
  在这次合并后,source的新的修改无法再向TARGET_WCPATH合并,也就是一次性的回到源头的合并。简直像是个魔法啊,哈哈
  这里起到关键作用的就是–reintegrate选项。
  另外注意,在归源合并中,不能指定版本区间-r或-c。


  4. 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过,你的本地版本号是不会变的,直接合并就会有问题。

共收到 0 条回复
暂无回复。
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表