百度百科的话来说:

 SVN Subversion的简称,是一个开放源代码的版本控制系统,相较于RCSCVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很 多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。       

 

在项目中经常会提交代码到svn中,不同时段,不同业务时需要做好项目的版本控制,分版本开发和上线,以便更好的维护项目有条不紊的进行。本文将介绍在Eclipse中如何对项目进行分支和合并的步骤和流程。


首先需要理清SVN的分支以下几个概念:

trunk: 主干(可以理解为开发环境的代码,平常做开发的工作目录)

branches:从主干拷贝了一份代码重新在svn服务器上的建了个分支目录(通常叫branch,一般与生产上的代码保持同步)

tag:主干版本标记(标识每次大的升级版本号)。


项目版本管理策略一般如下(可以根据自已的项目实际需要建立不同的版本管理策略):

1、系统在没有上线之前,只有一个主干(trunk),所有开发人员在主干上进行协同开发。

2、系统上线之后,在主干的基础上创建一个分支,该分支上主要用于修复生产环境的BUG,或者紧急新功能上线。主干仍然进行新功能模块的开发。

3、每次生产环境的升级,都从分支上进行打包部署。升级完之后需将分支上改动的代码及时合并到主干上(开发人员常常忘记,切记)。

4、新功能在主干上开发好了,需要进行一次大的升级,可以先将主干打上一个TAG做为大版本号,并且同时在此基础上创建一个对应的分支,然后切换到分支上进行打包部署,这个版本的生产代码维护也在分支上。


原则:分支用于生产代码维护,主干用于平时开发,TAG用于主干大版本的标记。



合并根据目标不同分为2种:

1、分支合并到主干:主要用在修复完生产BUG,并上线之后。需把改动的代码合并到主干上。

被操作的对象:主干

From :主干的打出分支时的版本(也可以理解为主干打出分支后第一次提交完毕的前一个版本,如果没有提交过,那就选择主干当前的最大版本号)

To : 分支的Head版本(分支的最新版本)

相当于从主干打出分支时的版本到分支的最后一个版本结束合并之后,替换主干。


怎么理解这个 From 和 To 呢 ? 似乎跟我们的想当然不太一样:因为我们理解,把分支合并到主干,肯定是 From 分支,To 主干。怎么搞反了呢?

实际上, Svn 认为,我们要合并的,是从主干的某个版本开始,到分支的某个版本结束。两边的版本号实际上是一套系统,不会有重复。


2、主干合并到分支:公用的逻辑改动,需反映到所有并行的分支上。

被操作的对象:分支

From :分支的第一个版本(分支最旧版本,也可以理解为分支第一次提交完毕的前一个版本,如果没有提交过,那就选择分支当前的最大版本号)

To :主干的Head版本(主干最新版本)

相当于从分支的第一个版本开始一直到主干最后一个版本结束合并之后,替换分支。


注意:合并是要在目标目录上进行操作的,如:分支合并到主干(主干为目标),需切换到主干上操作合并功能,主干合并到分支(分支为目标),需切换到分支上进行操作。


分支合并到主干的具体步骤:

1、主干目录右键选择合并

也谈svn分支与合并_第1张图片

 出现以上6个合并选项,

第一个选项:合并指定的版本,可以是从分支合并到主干,也可以是主干合并的版本,主要作用把分支的部份修改合并到主干上。

第二个选项:复兴分支,这里会把分支上所有的需改都合并到主干上。如果只想合并修改的一部分,并适合这项。

第三个选项:将主干上的修改合并到分支。

第四个选项:2个不同的分支合并,但其实也可以是分支和主干的合并,只要from选择为主干就行。

通常选择第一项或第四项进行操作,这里需要注意的是:

这里其实就是比对TO版本和FROM版本的差异,并把差异合并到TO的当前版本(head版本)中去。

 

注:如果要把分支所有的修改合并到主干上,FROM需要选择主干创建分支时的版本号,TO选择分支最新版本(head版本)就行了。

      如果FROM也选择主干head版本,TO也选择head版本,就会把所有分支与主干不同的差异覆盖到当前主干上来。造成主干的文件被分支覆盖。




合并当中如果出现:

1、no uncommited modified :表示当前版本还有没有提交的文件,如果不需要提交就选择revert.

2、working copy at a single version:表示当前目录没有从SVN服务器更新最新的版本。update下后在操作就行了。

3、合并后的文件如果出现类似如下图的情况,表明分支和主干上的同一段代码被修改,需要手动解决冲突之后,然后将目标文件:标记为解决,最后再提交改文件。

主干上的代码:

发生冲突后:

也谈svn分支与合并_第2张图片

目标文件会出现多个版本:

也谈svn分支与合并_第3张图片

(修改)在分支上Test.java中采用主干的内容:

wKiom1h4gDWgRCU0AAAXuOIKaaU041.png

在目标类上标记冲突已解决:

也谈svn分支与合并_第4张图片

解决后,其他版本的文件自动消失后便可提交目标文件:

也谈svn分支与合并_第5张图片