程序员编写程序的过程中,每个程序都会有很多不同的版本,这就需要程序员很好的管理代码,在需要的时间可以取出需要的版本,并且每个版本都有一个完整的说明。
使用Subversion(简称SVN)作为版本管理工具。在多个程序员管理同一段代码的过程中,版本的管理显得尤为重要,使用SVN可以方便的进行分支、合并,记录下所有的版本。
把版本划分为主线trunk 和分支branch和标记tag。主线最干净的版本,是线上运行的稳定版本。开发新功能从主线切出分支后,在分支上开发,开发结束并测试通过后才提交到主线上。Tag的主要作用是可以快速的回退到某一个稳定的时间点.
严格控制branch的数量,保持trunk版本的稳定,branch开发完成上线后merge回trunk,branch消除。有冲突解决机制,由冲突当事人仔细核对,敲定最终版本。branch merge到trunk由专人负责,避免错误修改提交到trunk。
Trunk稳定后, 上线时做一个tag. Trunk 上线后, 可能会有不尽人意的地方,也许需要回退到先前的一个版本. 这时就可以回退到前几次上线时做的tag.
Trunk 和tag 由专人负责, 开发人员只能往branch中提交代码, trunk 和tag对开发人员只有读的权限.
版本控制基本流程:
1) 各开发小组建立自己的分支,并在此分支上开发
2) 各开发小组把分支合并到主干上并形成较为稳定
3) 各个小组重新从主线上建立新的分支,在此分支上开发(即回到第一步)
4) 循环往复,直到工程结束。
项目实施版本控制分为4个步骤:
1) 开发版本develop, 如果有几个小组同时开发,可以切出多个分支。
2) 内测版本alpha,开发完成后转为alpha版本,做内部测试。
3) 公测版本beta,内部测试通过后转为beta版本,对外公开测试。
4) 上线版本production,测试全部通过后转为production版本,并合并到主线上
SVN版本库布局
一个版本库包含多个项目,通常按分支来安排布局:
/trunk/project1
/trunk/project2
/branches/project1
/branches/project2
/tags/project1
/tags/project2
或者按项目:
/project1/trunk
/project1/branches
/project1/tags
/project2/trunk
/project2/branches
/project2/tags
如果项目不是密切相关,而且每一个是单独被检出,那么按项目布局是合理的。对于那些你想一次检出所有项目,或需要将它们打成一个分发包的相关项目,按分支来布局通常比较好。这种方式你只要检出一个分支,而且子项目之间的关系也比较清楚。
分支与标记
版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上。这条线被称为分支。分支经常被用来试验新的特性,而不会对主干线干扰。当新的特性足够稳定之后,开发品的分支就可以混合回主分支里(主干线).
版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何时候重新建立一个特定的构件和环境。这个过程被称作标记。
Subversion 没有用于建立分支和标记的特殊命令,但是使用所谓的cheap copy来代替。cheap copy类似于Unix里的硬连接,它意思是代替一个版本库里的完整的拷贝,创建一个内部的连接,指向一个具体的版本树。结果分支和标记就迅速被创建,并 且没有在版本库里占据任何额外的空间。
Merge
当程序到达一个比较稳定的阶段,就需要把分支合并到主干上,下面讲述一下合并的流程。
1) Term1 从trunk切出branch (term1_090420), Term2 从trunk切出branch (term2_090420)
2) Term1与Term2分别修改自己分支上的代码.
3) Term1先把主干check out到本地。然后在主干的目录上右键选择Term->merge,弹出如下窗口:
此对话框的含义是把From指定的分支版本到To指定的分支版本之间的差异合并到主干上。
在这里分支选的是term1_090420。
然后直接点击merge进行合并,你也可以通过dry run来看是不是两者之间有差异。由于没有其它人修改主干,所以合并的很顺利,合并完毕之后,由xb对主干进行提交。
4) 将term2_090420分支合并到主干,解决冲突.
Term1合并完毕之后,Term2要将他的分支合并到主干上去,方法同上。但是由于Term1已经修改过主干,所以产生了冲突,会弹出一个冲突对话框。双击对话框中的产生冲突的文件名,就可以调出工具对此文件进行合并。
其它注意事项
文件的删除、移动与重命名
你可以重命名、移动或删除你的文件或文件夹,但请使用SVN进行这些操作,否则之前的版本信息会丢失。
文件的删除、移动与重命名之前,必须保证工作目录是最新的版本;进行这些操作之后,需要进行提交。
提交的时机
每个工程会有很多个小模块,当某个模块达到稳定的时候,你就需要提交一次,以免写下个模块代码的时候出现不可恢复的错误。
每一次提交需要前,需要通过Java编译检查,保证是一个编译没有错误的版本。当提交比较稳定的版本的时候,同时要修改你的版本号。
提交的时候要添加注释,若多人共同修改同一段代码我们就需要为注释添加上更加详细的说明