SVN分支和合并 博客分类: svn/git/perforce svnmergetrunkbranch
程序员文章站
2024-03-20 15:12:28
...
需要注意的是Branch和Trunk使用同一套版本号,也就是说无论在Branch还是Trunk的提交都会引起主版本号的增加。这是因为svn copy只支持同一个repository内的文件copy,并不支持跨repository的copy,所以新创建的Branch和Trunk都属于同一个repository。
参考SVN分支和合并的简单例子
http://www.panweizeng.com/svn-branching-merging.html
尽管svn没有作强制要求,但是一般svn版本库目录建议创建trunk、branches和tags三个目录。 在实际操作时,trunk主干版本要时刻保持干净,即随时可以基于这个版本进行修改并将应用部署上线。branches是分支目录,存放并行开发的项目代码,因为分支是主干的廉价拷贝(相当只是提交了一次主干版本,增加了一个版本号,并没有取出版本库作镜像拷贝),所以你可以放心建立很多分支版本。不过Subversion不支持跨版本库的拷贝,当使用svn copy时你只能在同一个版本库内操作。tags目录存放trunk某个的快照,比如说release-1.0即trunk处于1.0版本时的快照。
使用svn来作团队的代码管理,那么分支和合并将是非常常用的操作。下面是一个简单的示例。
1. 创建分支。这里假设你要负责一个叫theme的项目,分支号1.7.2。
#这里的localhost是svn服务器地址
svn copy -m "1.7.2 - theme" svn://localhost/www/trunk svn://localhost/www/branches/branch1.7.2-theme
svn co svn://localhost/www/branches/branch1.7.2-theme
2. 从trunk中merge到分支。忙了一个星期终于开发完了,但是开发期间trunk版本有过改动,部署上线前你需要合并trunk的代码。
#branch1.7.2-theme是分支目录,注意不可以进到分支子目录
cd branch1.7.2-theme
#前面的12972是开分支之前trunk的版本号,后面的12991是merge时trunk的版本号
svn merge -r 12972:12991 svn://localhost/www/trunk
如果有冲突选择p(postpone),merge完了之后使用svn st|grep ^C查看冲突文件,然后比对修改冲突文件。解决冲突后再check in ,信息写上执行的merge操作。
svn ci -m 'svn merge -r 12972:12991 svn://localhost/www/trunk'
3. 从分支merge到trunk。上线测试完毕,你很幸运,一切都如预期正常,这时就要将分支回归trunk,将trunk更新到最新。
#先从trunk checkout一份新鲜的代码,然后cd到该版本目录下
svn co svn://localhost/www/trunk
cd trunk
#12973是分支开始的版本号,13006是分支结束的版本号
svn merge -r 12973:13006 svn://localhost/www/branches/branch1.7.2-theme
如步骤2一样解决冲突,解决冲突后再check in,信息写上执行的merge操作。
svn ci -m "svn merge -r 12973:13006 svn://localhost/www/branches/branch1.7.2-theme"
相关的手册可以参阅svn文档。
SVN中Branch的创建与合并
http://www.cnblogs.com/huang0925/p/3254243.html
在使用源代码版本控制工具时,最佳实践是一直保持一个主干版本。但是为了应付实际开发中的各种情况,适时的开辟一些分支也是很有必要的。比如在持续开发新功能的同时,需要发布一个新版本,那么就需要从开发主干中建立一个用于发布的分支,在分支上进行bug fix,维护版本的稳定,并适时的将一些改动合并回主干。目前大红大紫的源代码版本控制工具git很受大家推崇,原因之一就是其在这方面的功能相当强大。其实老牌的SVN也是有这样的功能的,接下来就给大家讲解下。
Branch的创建
在SVN中主干代码一般是放置在Trunk目录下的,如果要新建Branch的话则放置在Branchs目录下。(注意这是一种约定,SVN并不强制你这样做)注意Branhs和Trunk目录要平级,不能有嵌套,要不会引起混乱。
myproject/
trunk/
branches/
tags/
创建一个Branch也相当简单,只需要一条命令即可。
svn copy http://example.com/repos/myproject/trunk http://example.com/repos/myproject/branches/releaseForAug -m 'create branch for release on August'
这条命令是指给myproject这个repo创建一个名为releaseForAug的branch,使用-m来加入描述。
之后你就可以通过 svn checkout http://example.com/repos/myproject/branches/releaseForAug来迁出你的Branch源文件,在上面进行修改和提交了。
其实SVN并没有Branch的内部概念。我们只是创建了一个repo的副本,并自己赋予这个副本作为Branch的意义,所以这与git中的Branch有很大不同。
需要注意的是Branch和Trunk使用同一套版本号,也就是说无论在Branch还是Trunk的提交都会引起主版本号的增加。这是因为svn copy只支持同一个repository内的文件copy,并不支持跨repository的copy,所以新创建的Branch和Trunk都属于同一个repository。
合并
既然要创建分支也需要合并分支。基本的合并也是蛮简单的。
假设现在Branch上fix了一系列的bug,现在我们想把针对Branch的改变同步到Trunk上,那么应该怎么做那?
保证当前Branch分支是clean的,也就是说使用svn status看不到任何的本地修改。
命令行下切换到Trunk目录中,使用 svn merge http://example.com/repos/myproject/branches/releaseForAug 来将Branch分支上的改动merge回Trunk下。
如果出现merge冲突则进行解决,然后执行svn ci -m 'description'来提交变动。
当然在merge你也可以指定Branch上那些版本变更可以合并到Trunk中。
svn merge http://example.com/repos/myproject/branches/releaseForAug -r150:HEAD
示例中是将Branch的从版本150到当前版本的所有改动都合并到Trunk中。
你也可以将Trunk中的某些更新合并到Branch中,还是同样的方法。
查看当前Branch和Trunk的合并情况
可以使用svn mergeinfo来查看merge情况。
查看当前Branch中已经有那些改动已经被合并到Trunk中:
# cd to trunk directory
svn mergeinfo http://example.com/repos/myproject/branches/releaseForAug
查看Branch中那些改动还未合并。
#cd to trunk directory
svn merginfo http://example.com/repos/myproject/branches/releaseForAug --show-revs eligible