什么是svn分支和主干
branch(分支)是某个development line(通常是主线也即trunk)的一个拷贝
如下图:
branch存在的意义在于,在不干扰trunk的情况下,和trunk并行开发,待开发结束后合并回trunk中,在branch和trunk各自开发的过程中,他们都可以不断地提交自己的修改,从而使得每次修改在repository中都有记录。
那么什么叫做合并。当branch开发完成后,将branch中的修改同步到trunk中,这个过程有可能包括修改文件、增加文件、删除文件等等。
主干与分支开发规范
在建立项目版本库时,可首先建好项目文件夹,并在其中建立trunk, branches, tags三个空的子目录。这样在trunk中开始进行开发
- trunk是主分支,是日常开发进行的地方。
-
branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客制化的版本,也可以放在分支中进行开发。
-
tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。
新建是哪个目录,以下是branches目录的新建方法,其他同理
svn的两种开发和发布的规范:
-
主干修改,分支发布
代码都在trunk上修改,需要发布的时候,从主干上拉出一个版本,如果该版本发现BUG则继续从该分支上修改,并将修改合并到主干上。
-
主干发布,分支修改
任何修改都不能在主干上直接进行,开发新功能,从主干上分支出一个版本,进行开发,发开测试完毕后,在合并到主干上。
第二种开发较为普遍,其优势在于各个分支独立进行,互不干扰,可以使不同开发周期的应用在同一个项目中开发进行。对于同一个应用,a组人开发完毕,b组人只做了一半,这个时候,对于主干修改,分支发布,这样是根本不能发布出去的,而对于主干发布,分支修改,只需要把a组的修改合并回主干就可以发布出去了,b组开发的根本不受影响。
分支与合并的例子
下面介绍一下分支,合并的应用场景,并针对场景进行一个小例子。
场景1: 采用主干发布,分支修改的规范后,项目要新开发一个功能,这时候我拉开了一个分支,开发完毕后要分支代码合并回主干。
场景2:我在分支的开发过程中,主干被其他的项目组进行较大的改动,为了避免在“正确”(trunk)的道路上走歪了,也为了避免最终合并代码的时候,太过麻烦,我需要将主干的代码合并到分支上来。
场景3:对于同一个文件,同一个方法内的代码合并的时候冲突问题解决。
场景准备
新建项目test,并提交到资源库trunk文件夹下
创建一个分支test2.0,项目右键-》team-》分支/标记
可以看到,分支创建成功
场景1实例
先切换到分支代码:项目右键-》team-》切换
然后将分支代码进行改动,添加了一个新类
然后将分支的修改代码提交svn一下,然后同样切换回主干trunk代码,准备合并。(图略)
切换回主干代码后,分支代码修改的地方,主干代码不受影响
项目右键-》team-》选择合并,然后选择第二个选项:分支合并到主干
场景2实例
删除主干的branches类
项目右键-team-先切换到分支代码
场景3实例:冲突解决
测试1
在分支版本修改Hello类的文件内容
切换为主干版本,合并
以上分支修改添加了代码,没有修改原有代码,没有造成冲突
测试2
将分支输出555555改为000000,重复以上步骤
,结果如下
还是没有冲突
测试3
同时修改2输出
主干合并分支最新版本之前的版本
合并类型详解
一、合并一个范围的版本(Merge a range of versions)
此类型应用最为广泛,主要是把分支中的修改合并到主干上来。在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本。合并的源URL填写的是要合并的分支的URL,待合并的版本范围如果为空,则指的是合并分支上所有的版本,即自从分支创建以来到分支当前最新版本的所有演变。如果只是选择其中一个版本,或者几个版本,那么就表示只是将制定的n个版本的变化合并到主干上。如果只是选择其中一个版本,那么表示只是选择那个版本的修改,之前或之后的修改将不被采纳。
二、复兴合并(Reintegrate a branch):我的svn插件没有这个选项
复兴合并可以理解为是第一种合并类型的一种特例,在复兴合并中,主干可以理解为是自从开创分支之后没有任何修改,而分支是经过修改的,而且合并中分支是没有版本选择的。经过复兴合并,分支中所有的修改都会合并到主干中,合并的结果将使得分支和主干一模一样,从而可以删除分支。
三、合并两个不同的树(Merge two different tress)
此类型与前两种类型不同,第一种类型可以选择分支合并的版本,主干不能选择版本;第二种类型是主干和分支都不能选择合并的版本;而这种类型则是无论是主干还是分支都可以选择合并的版本,即可以选择过去的一个主干版本与分支的某个版本进行合并。合并的时候以选择的分支版本为主,如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃。
起始URL:选择主干目录的URL(应当和当前工作副本的URL一致,这个是所谓的合并点)
结束URL:选择要合并的分支的URL。
起始和结束的版本:一般起始版本应当找到最后一次同步时的版本,如果从没有同步过(第一次合并),则选择创建分支时的版本,结束版本一般是最新版本,如果你不想将某些内容合并进主干的话,也可以选择一个合并点。