项目版本控制
一、基本概念
trunk: 主干(可以理解为开发环境的代码,平常做开发的工作目录)
branches:从主干拷贝了一份代码重新在svn服务器上的建了个分支目录(通常叫branch,一般与生产上的代码保持同步)
tag:主干版本标记(标识每次大的升级版本号)
二、管理原则
1、系统在没有上线之前,只有一个主干(trunk),所有开发人员在主干上进行协同开发。
2、系统上线之后,在主干的基础上创建一个分支,该分支上主要用于修复生产环境的BUG,或者紧急新功能上线。主干仍然进行新功能模块的开发。
3、每次生产环境的升级,都从分支上进行打包部署。升级完之后需将分支上改动的代码及时合并到主干上(开发人员常常忘记,切记)。
4、新功能在主干上开发好了,需要进行一次大的升级,可以先将主干打上一个TAG做为大版本号,并且同时在此基础上创建一个对应的分支,然后切换到分支上进行打包部署,这个版本的生产代码维护也在分支上。
原则:分支用于生产代码维护,主干用于平时开发,TAG用于主干大版本的标记。
三、合并
合并根据目标不同分为2种:
1、分支合并到主干:主要用在修复完生产BUG,并上线之后。需把改动的代码合并到主干上。
2、主干合并到分支:公用的逻辑改动,需反映到所有并行的分支上。
注意:合并是要在目标目录上进行操作的,如:分支合并到主干(主干为目标),需切换到主干上操作合并功能,主干合并到分支(分支为目标),需切换到分支上进行操作。
第一个选项:合并指定的版本,可以是从分支合并到主干,也可以是主干合并的版本,主要作用把分支的部分修改合并到主干上。
第二个选项:将主干上的修改合并到分支。
第三个选项:两个不同的分支合并,但其实也可以是分支和主干的合并,只要from选择为主干就行。
通常选择第一项或第三项进行操作,这里需要注意的是:
这里其实就是比对TO版本和FROM版本的差异,并把差异合并到TO的当前版本(head版本)中去。
注:如果要把分支所有的修改合并到主干上,FROM需要选择主干创建见分支时的版本号,TO选择分支最新版本(head版本)就行了。
如果FROM也选择主干head版本,TO也选择head版本,就会把所有分支与主干不同的差异覆盖到当前主干上来。造成主干的文件被分支覆盖。
举例(分支合并到主干):
主干trunk:
https://192.168.0.11:8443/svn/code/product/trunk/项目名称/code/OSGiServer/plugins/com.tzf.svn.test
分支branches:
https://192.168.0.11:8443/svn/code/product/branches/项目名称/code/OSGiServer/plugins/com.tzf.svn.test
先 从http://subversion.apache.org/packages.html#windows 下载win32svn文件:Setup-Subversion-1.6.13。安装,在cmd下,svn 命令就可以了。下载这个的作用有两个:查看分支分出时的版本和解决合并冲突。
被操作对象: 主干
From : 主干的 打出分支时的版本
To: 分支的 Head版本 (最新版本)
好啦,现在将工程切换到主干里,因为从分支合并到主干,被操作对象是主干工程。
要合并得知道分支分出去时的版本号,cmd打开命令行,使用svn log --verbose --stop-on-copy 【branch_path】查看版本更新信息,如图:
找到最下版本信息,这里就是r8623,记住这个版本号,以后合并的from就是从这个版本号开始的。to就是指你想要合并的版本号,一般都是最新版本,当然也可以是指定版本。
切换到主干,选中工程,右键team -> 合并:
next,出现(如果没提交要先提交)
from就是分支的路径,下面选择的就是刚刚记下的分支分出的版本号,to这里就是合并到那个版本,我这里选择的最新版本。点finish,如果文件有冲突就弹出询问框,选择现在暂时不处理就行。
我这里没有出现文件冲突,点ok就基本大功告成。这时需要在主干里体检带修改符号的文件,完成提交就搞定了合并。
如果文件冲突了怎么办呢,在命令行下进入冲突文件的目录,用svn命令行客户端键入:svn resolved 冲突的文件名 就可以解除冲突。
好了这是从分支到主干的合并。还有两种合并:从主干到分支和从分支到分支,操作也是大同小异。具体参考如下:
从主干合并到分支
试想这样的情况:一个项目里面,要独立出来一个子项目,需要单独发布版本,用到了基础框架代码,而基础框架在主干中不断修改完善,这就需要从主干合并到分支。
被操作对象: 分支
From: 分支的第一个版本(最旧版本)
To: 主干的Head版本(最新版本)
相当于从分支的第一个版本开始一直到主干最后一个版本结束合并之后,替换分支。
从分支合并到分支
有 这样的需求:一个项目中有很多分支,这些分支需要分期上线,有多个工作并行,但每一期之间不能相互影响,这就可以打出几个tag(也是分支),从主干 copy而来。其他主干根据排期分别合并到这些tag中来。比如有prjTag1和prjTag2,model1、model2需要合并到prjTag1 中,model3、model4需要合并到prjTag2中。拿prjTag1举例:
在prjTag1的work copy中,merge
From : 主干的 打出分支时的版本
To: 分支的 Head版本 (最新版本)
注意: From不是本Tag的某个版本,而是之前主干打出分支时的版本,最终Merge到prjTag1的work copy,而prjTag1是找不到当初打分支时的版本的。
四、分支
需求:branches开发完切一个分支到tags
TortoriseSVN--->Branch/tag,选择tags存放路径。