版本控制(二)--svn分支操作

        产生原因

        eg1:在一个基础平台上进行开发,每个技术小组负责一个子项目,而基础平台也是有可能会继续更改的,这个时候,如果不创建分支,子项目之间会相互影响,影响最大的就是后期的测试和版本发布,子项目A已经结束,但测试却受到正在进行的子项目B的影响,测试通不过,就别说版本发布了。所以,我们需要从目前的项目(主干trunk)中创建分支(branch),隔离子项目间的相互影响。

        eg2:如果你的项目需要开发一个新功能,而该功能可能会修改项目中的绝大多数文件,而与此同时,你的另一位同事正在进行bug fix,如果你的新功能不在branch中开发而直接在trunk中开发,那么你极有可能影响另一位同事的bug fix,他/她在bug修复中可能会遇到各种各样的问题,因为你的频繁提交代码引入了过多的不稳定因素。你可能会说,那我在开发的过程中不提交不就行了,等到我全部开发结束我再提交,是,你可以这么做,那还要版本控制干什么呢?也许等到你最后提交代码的时候(也许一周,也许两周?),你会发现有一大堆conflict等着你resolve。

    概念

       分支:按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图:

         其实SVN并没有Branch的内部概念。我们只是创建了一个repo的副本,并自己赋予这个副本作为Branch的意义,所以这与git中的Branch有很大不同。需要注意的是Branch和Trunk使用同一套版本号,也就是说无论在Branch还是Trunk的提交都会引起主版本号的增加。这是因为svn copy只支持同一个repository内的文件copy,并不支持跨repository的copy,所以新创建的Branch和Trunk都属于同一个repository

        合并:当branch开发完成后(包括必要的测试),将branch中的修改同步到trunk中,这个过程有可能包括修改文件、增加文件、删除文件等等。

     常用操作         

         前提:repository 目录,D:\TortoiseSVN\TestRepository;

         work copy(check out):D:\TortoiseSVN\TestSVN。操作:Added /branches 、Added tags、Added /trunk 、Added /trunk/My Project。

         创建分支: 

         在svn中,创建分支,实际上就是一个版本拷贝(对应copy to...注意:绝不是简单在客户端上copy一个目录,而是svn仓库中copy,文件版本号会增加。),两边做任何修改发生的版本变化,是一套机制。举例:目前主干版本是100,分支版本是101,主干中增加一个文件,版本为102,分支中再增加一个文件,版本就为103了。两边的版本号是一套,不会重复。

         在工程目录上/trunk/MyProject右键,依次选择"TortoiseSVN" -> "Branch/tag...",在弹出窗口的"To URL"中填入分支的地址,在这里目标revision选择HEAD revision,如下图所示,添加log后点击ok分支便建立了。这个操作速度非常快,新建的branch在repository中其实只是一个指向trunk某个revision的软连接而已,并没有真的复制文件。

         check out分支

         右键本地目录TestSVN选择"TortoiseSVN Update"即可将刚刚建立的分支下载回本地。进入/branches/MyProject目录下你会发现其文件结构和/trunk/MyProject一模一样。

        同步工作:

          1. 将trunk中的修改同步到branch(从主干合并到分支):
          branch和trunk在独立、并行地开发。为了防止在“错误”的道路上越走越远,现在branch是时候和trunk来一次同步了(将trunk合并到branch)或者一个项目里面,要独立出来一个子项目,需要单独发布版本,用到了基础框架代码,而基础框架在主干中不断修改完善,这就需要从主干合并到分支。
         被操作对象:分支
         From:分支的第一个版本(最旧版本)
         To:主干的Head版本
         最新版本,相当于从分支的第一个版本开始一直到主干最后一个版本结束合并之后,替换分支。


             首先,在本地trunk中先update一下,有冲突的解决冲突,保证trunk和repository已经完全同步,然后在/branches/MyProject上右键,依次选择"TortoiseSVN" -> “Merge...”,在弹出的窗口中选择第一项"Merge a range of revision",这个类型的Merge已经介绍得很清楚,适用于将某个分支或主线上提交的多个revision间的变化合并到另外一个分支上。
             提交合并后的branch。
            2.将branch合并回trunk(从分支合并到主干):
           被操作对象:主干
           From:主干的打出分支时的版本
           To:分支的Head版本(最新版本)

           a.在/trunk/MyProject上右键(注意是在主线的目录上右键),依次选择"TortoiseSVN" -> "Merge...",在弹出的窗口中,Merge type选择第二项" Reintegrate a branch",这种类型的合并适合在分支开发结束后将所有的改动合并回主线,
           b.上图:"From URL"选择/branches/MyProject,无需选择revision号,Reintegrate会将branch上所有修改合并到trunk。后面的步骤和上文第9步中的一样,不再啰嗦了。如无意外,branch将成功合并到trunk,你需要做的只是将合并后的trunk赶紧commit。
          c.提交提交合并后的trunk。
          删除分支
          如果你认为你新加的功能已经开发完成了,你可以删除你的分支。
总结:
1.branch主要用于新功能的开发
2合并发生在本地working copy,只要你不提交就不会影响到repository
3.合并前一定要先update、commit,保证不会out of day,并将本地的修改保存到repository
4.branch和trunk并行开发的过程中,要经常同步,将trunk的修改合并到branch,合并时选择"Merge a range of revision"
5.branch最后合并回trunk时,merge type选择"Reintegrate a branch

         svn命令行分支操作

         1.创建分支

svn copy trunk_path branch_path -m ‘描述’
         2.checkout
svn checkout branch_path
         3.合并(使用merge info查看合并情况)
//合并主干上的最新代码到分支上
cd br_feature001
svn merge http://svn_server/xxx_repository/trunk
//如果需要预览该刷新操作,可以使用svn mergeinfo命令,如:
svn mergeinfo http://svn_server/xxx_repository/trunk --show-revs eligible

// 分支合并到主干,一旦分支上的开发结束,分支上的代码需要合并到主干。SVN中执行该操作需要在trunk的工作目录下进行。命令如下:
cd trunk
svn merge --reintegrate http://svn_server/xxx_repository/branches/br_feature001
//分支合并到主干中完成后应当删该分支,因为在SVN中该分支已经不能进行刷新也不能合并到主干。

//合并版本并将合并后的结果应用到现有的分支上
svn -r 148:149 merge http://svn_server/xxx_repository/trunk
       总结,不管是合并到分支还是主干,实质是一样的,cd Apath,svn merge Bpath就是将B 合并到A(-r x1:x2就是从x1版本到x2版本)
      4.建立tags
//产品开发已经基本完成,并且通过很严格的测试,这时候我们就想发布给客户使用,发布我们的1.0版本
svn copy http://svn_server/xxx_repository/trunk http://svn_server/xxx_repository/tags/release-1.0 -m "1.0 released"
     5.删除分支或tags
svn rm http://svn_server/xxx_repository/branches/br_feature001
svn rm http://svn_server/xxx_repository/tags/release-1.0
------------------------

参考:
http://blog.csdn.net/e3002/article/details/21469437
http://blog.csdn.net/fbysss/article/details/5437157

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值