`
MauerSu
  • 浏览: 497782 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SVN版本合并(merge)原理与操作指南

 
阅读更多
源:http://daquan198163.iteye.com/blog/965936
http://www.subversion.org.cn/svnbook/1.4/svn.branchmerge.copychanges.html
评:

SVN的合并操作其实是一系列操作的组合:
将主干或某个分支上的一组修订(即合并的源头)应用到另一个分支或主干(即合并的目标)的working copy(本地工作拷贝);简单说,合并包括三要素——源头、目标、目标的working copy;
如果出现冲突(conflict),需手工解决冲突;
最后提交,提交时还要在SVN备注中标明这是一次合并,如merge -r 5645:5650 svn://10.191.17.67/p17_ii/development/sourcecode/Branchs/P17-II/2011-03-17 发布前又有小改动;
为何会出现冲突,如何解决:
源不仅是个url,还包括一个修订范围,例如前面红字示例中的-r 5645:5660;
假设源头包含5646、5648、5650三个修订版,working copy的当前修订版是5649;
那么合并时SVN实际进行的操作是:diff 5646 5648,然后apply到working copy;diff 5648 5650,然后apply到working copy;
这个过程中,svn也会分别diff 5646 5649,diff 5648 5649,如果这两个diff任何一个与上文的两个diff中的任何一个恰好改了同一行代码,则出现冲突,相应的文件中会用标记分别标明这两种diff差异,同时会生产3个临时文件,分别是.working、.left_r5646、.right_r5650;
一般选择手工解决冲突,但如果很对,也可以直接保留.right_r5650作为最终结果,
更多内容,详见svnbook。

-----------------------------
合并背后的关键概念

你已经看到了svn merge命令的例子,你将会看到更多,如果你对合并是如何工作的感到迷惑,这并不奇怪,很多人和你一样。许多新用户(特别是对版本控制很陌生的用户)会对这个命令的正确语法感到不知所措,不知道怎样和什么时候使用这个特性,不要害怕,这个命令实际上比你想象的简单!有一个简单的技巧来帮助你理解svn merge的行为。

迷惑的主要原因是这个命令的名称,术语“合并”不知什么原因被用来表明分支的组合,或者是其他什么神奇的数据混合,这不是事实,一个更好的名称应该是svn diff-and-apply,这是发生的所有事件:首先两个版本库树比较,然后将区别应用到本地拷贝。

这个命令包括三个参数:

初始的版本树(通常叫做比较的左边),

最终的版本树(通常叫做比较的右边),

一个接收区别的工作拷贝(通常叫做合并的目标)。

一旦这三个参数指定以后,两个目录树将要做比较,比较结果将会作为本地修改应用到目标工作拷贝,当命令结束后,结果同你手工修改或者是使用svn add或svn delete没有什么区别,如果你喜欢这结果,你可以提交,如果不喜欢,你可以使用svn revert恢复修改。

svn merge的语法允许非常灵活的指定三个必要的参数,如下是一些例子:

$ svn merge http://svn.example.com/repos/branch1@150 \
            http://svn.example.com/repos/branch2@212 \
            my-working-copy

$ svn merge -r 100:200 http://svn.example.com/repos/trunk my-working-copy

$ svn merge -r 100:200 http://svn.example.com/repos/trunk
第一种语法使用URL@REV的形式直接列出了所有参数,第二种语法可以用来作为比较同一个URL的不同版本的简略写法,最后一种语法表示工作拷贝是可选的,如果省略,默认是当前目录。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics