欢迎大家访问博主的博客新家:IT博客达人网 (http://www.blogdaren.com)[耶]

svn merge详解 【OK】

manon 2010-7-20 14:07 Linux/Unix 1条评论 2084人打酱油 打开侧边栏| 关闭侧边栏
  Subversion的分支通常用于在主干程序之外,对程序进行修改。这样 可以在不扰乱主干程序进行的开发、测试、发布流程之外,尝试一下新功能的研究、修改。如果觉得新功能没问题,可以将分支合并到主干程序中。
  合并前,需要将分支提交(Commit),由此看来,合并操作好象是在服务端和本地客户端同时进行的操作。
  合并时,要从主干的working copy的右键菜单开始,"From" Url是合并的目的地,需选择主干的url,"To"是合并的来源,需选择分支的url。
  svn 的 merge其实很好用,当然前提是你明白了svn merge这个命令: 比如我们要把分支merge到主干上

# svn merge --help
merge: Apply the differences between two sources to a working copy path.

用法:
1. svn merge  sourceURL1[@N]                sourceURL2[@M]           [WCPATH]
2. svn merge  sourceWCPATH1@N          sourceWCPATH2@M      [WCPATH]
3. svn merge  [-c M | -r N:M]                      SOURCE[@REV]            [WCPATH]

我们以第一个为例:
svn merge  sourceURL1[@N]       sourceURL2[@M]          [WCPATH]
这个help里面提示,merge需要三个参数
sourceURL1,sourceURL2 的含义并不是两个分支或者一个分支一个主干,而是代表同一个分支的两个状态或者说是两个版本,对这两个版本做一个diff,然后把diff的结果,应用到 最后的参数WCPATH上,WCPATH代表一个本地已经checkout的工作区

svn merge的思想是: diff and apply

比如,我开发一个项目叫做proj
目录结构是
proj/trunk
proj/branches
proj/tags

(省 略了http:// 之后的,只是相对路径,但是真正使用时候不能省略)
当版本达到100的时候,我决定做一个branch进行一些其他 开发:
 [Reversion:100]
 $svn cp proj/trunk     proj/branches/proj_branch_1
 OK Reversion:101

然后,trunk和proj_branch_1都在并行开发,到了某一个版本,比如150,branch开发完成,这时需要merge回到 trunk
此时的目录结构是
[Reversion:150]
proj/trunk
proj/branches/proj_branch_1
proj/tags

按照svn的实现,我需要知道proj_branch_1所做的所有的变化,也就是分支当前的状态相对刚刚生成的时候(svn cp时)状态的变化,根据这个变化生成一个diff文件,再apply一个本地的工作区上。(建议是一个干净的本地trunk工作区)

那么执行:
$cd proj/trunk
$svn merge proj/branches/proj_branch_1@101 proj/branches/proj_branch_1 .

其实:
第一个URL(我们称之为左边),为起始状态,通过最后的@101 表示取版本101, 这个101就是svn cp成功之后的那个版本。
第二个URL(我们称之为右边),为最终状态,默认取最新的, 左边和右边做了 一个diff,应用到当前工作区目录,也就是trunk。 此时  $svn st 就可以看到变化了

这里有一个问题是如何获取这个cp之后的版本,也就是例子中的101可以使用svn log里面的 --stop-on-copy 命令
$svn log --stop-on-copy proj/branches/proj_branch_1, 屏幕会到cp的时候停下来,那里边标注的版本就是需要的版本

 比如,下面是一个真实的例子:
 ----------------------------------------------------------------------------------------------------------------
 r995 | lgh | 2010-07-19 09:25:10 +0800 (一, 19 07月 2010) | 1 line

 Create a branch for proj client using
 ----------------------------------------------------------------------------------------------------------------
 其中的 r995,995就是我需要的版本
 (说明一下,commit时候写comment的好处,比如这里我就很明确的肯定这是 branch的起始版本)

对于svn merge的其他用法也是类似,只要明白了是根据左边,右边生成diff,然后应用到本地的一个工作区就容易理解了。

你还可以使用svn merge --dry-run来模拟merge一下,看一下merge会发生什么,而不是真正的做这个动作。

而对于 merge的help里面的

 3. svn merge   [-c M | -r N:M]    SOURCE[@REV]     [WCPATH]
这个也很容易理 解,就是取 SOURCE 这个东西,版本N,M之间的区别,作用在WCPATH这个本地工作区上

注意!
做 branch千万别根据本地修改过的工作区做,一定基于某一个URL的版本做,diff的时候,diff不出来,因为基于本地工作区的,所以现在merge起来很是费劲。
正文部分到此结束

版权声明:除非注明,本文由( manon )原创,转载请保留文章出处

本文链接:svn merge详解 【OK】

继续浏览:木有标签

Sexy ORM — 全面革新的 ORM 系统
VIM设置代码折叠

评论列表

  1. arham2018-03-28 04:00回复
    这篇文章中的最好的东西是作者的写作技巧,这是非常令人印象深刻的。

发表评论

看看右边的头像对不对?→_→