myeclipse中svn的分支与合并

什么是svn分支和主干

branch(分支)是某个development line(通常是主线也即trunk)的一个拷贝
如下图:
《myeclipse中svn的分支与合并》

branch存在的意义在于,在不干扰trunk的情况下,和trunk并行开发,待开发结束后合并回trunk中,在branch和trunk各自开发的过程中,他们都可以不断地提交自己的修改,从而使得每次修改在repository中都有记录。

那么什么叫做合并。当branch开发完成后,将branch中的修改同步到trunk中,这个过程有可能包括修改文件、增加文件、删除文件等等。

主干与分支开发规范

在建立项目版本库时,可首先建好项目文件夹,并在其中建立trunk, branches, tags三个空的子目录。这样在trunk中开始进行开发

  • trunk是主分支,是日常开发进行的地方。

  • branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客制化的版本,也可以放在分支中进行开发。

  • tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。
    新建是哪个目录,以下是branches目录的新建方法,其他同理
    《myeclipse中svn的分支与合并》
    《myeclipse中svn的分支与合并》

svn的两种开发和发布的规范:

  • 主干修改,分支发布

    代码都在trunk上修改,需要发布的时候,从主干上拉出一个版本,如果该版本发现BUG则继续从该分支上修改,并将修改合并到主干上。

  • 主干发布,分支修改

    任何修改都不能在主干上直接进行,开发新功能,从主干上分支出一个版本,进行开发,发开测试完毕后,在合并到主干上。

第二种开发较为普遍,其优势在于各个分支独立进行,互不干扰,可以使不同开发周期的应用在同一个项目中开发进行。对于同一个应用,a组人开发完毕,b组人只做了一半,这个时候,对于主干修改,分支发布,这样是根本不能发布出去的,而对于主干发布,分支修改,只需要把a组的修改合并回主干就可以发布出去了,b组开发的根本不受影响。

分支与合并的例子

下面介绍一下分支,合并的应用场景,并针对场景进行一个小例子。

场景1: 采用主干发布,分支修改的规范后,项目要新开发一个功能,这时候我拉开了一个分支,开发完毕后要分支代码合并回主干。

场景2:我在分支的开发过程中,主干被其他的项目组进行较大的改动,为了避免在“正确”(trunk)的道路上走歪了,也为了避免最终合并代码的时候,太过麻烦,我需要将主干的代码合并到分支上来。

场景3:对于同一个文件,同一个方法内的代码合并的时候冲突问题解决。

场景准备

新建项目test,并提交到资源库trunk文件夹下
《myeclipse中svn的分支与合并》
创建一个分支test2.0,项目右键-》team-》分支/标记
《myeclipse中svn的分支与合并》
《myeclipse中svn的分支与合并》
《myeclipse中svn的分支与合并》

可以看到,分支创建成功
《myeclipse中svn的分支与合并》

场景1实例

先切换到分支代码:项目右键-》team-》切换
《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

然后将分支代码进行改动,添加了一个新类
《myeclipse中svn的分支与合并》
然后将分支的修改代码提交svn一下,然后同样切换回主干trunk代码,准备合并。(图略)

切换回主干代码后,分支代码修改的地方,主干代码不受影响
《myeclipse中svn的分支与合并》
项目右键-》team-》选择合并,然后选择第二个选项:分支合并到主干
《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

场景2实例

删除主干的branches类
《myeclipse中svn的分支与合并》
项目右键-team-先切换到分支代码
《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

场景3实例:冲突解决

测试1

在分支版本修改Hello类的文件内容
《myeclipse中svn的分支与合并》
切换为主干版本,合并
《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

以上分支修改添加了代码,没有修改原有代码,没有造成冲突

测试2

将分支输出555555改为000000,重复以上步骤
,结果如下
《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》
还是没有冲突

测试3

同时修改2输出
主干合并分支最新版本之前的版本
《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

《myeclipse中svn的分支与合并》

合并类型详解

一、合并一个范围的版本(Merge a range of versions)

   此类型应用最为广泛,主要是把分支中的修改合并到主干上来。在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本。合并的源URL填写的是要合并的分支的URL,待合并的版本范围如果为空,则指的是合并分支上所有的版本,即自从分支创建以来到分支当前最新版本的所有演变。如果只是选择其中一个版本,或者几个版本,那么就表示只是将制定的n个版本的变化合并到主干上。如果只是选择其中一个版本,那么表示只是选择那个版本的修改,之前或之后的修改将不被采纳。

二、复兴合并(Reintegrate a branch):我的svn插件没有这个选项

   复兴合并可以理解为是第一种合并类型的一种特例,在复兴合并中,主干可以理解为是自从开创分支之后没有任何修改,而分支是经过修改的,而且合并中分支是没有版本选择的。经过复兴合并,分支中所有的修改都会合并到主干中,合并的结果将使得分支和主干一模一样,从而可以删除分支。

三、合并两个不同的树(Merge two different tress)

   此类型与前两种类型不同,第一种类型可以选择分支合并的版本,主干不能选择版本;第二种类型是主干和分支都不能选择合并的版本;而这种类型则是无论是主干还是分支都可以选择合并的版本,即可以选择过去的一个主干版本与分支的某个版本进行合并。合并的时候以选择的分支版本为主,如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃。

起始URL:选择主干目录的URL(应当和当前工作副本的URL一致,这个是所谓的合并点)

结束URL:选择要合并的分支的URL。

起始和结束的版本:一般起始版本应当找到最后一次同步时的版本,如果从没有同步过(第一次合并),则选择创建分支时的版本,结束版本一般是最新版本,如果你不想将某些内容合并进主干的话,也可以选择一个合并点。

参考
myeclipse插件—SVN分支与合并详解
SVN创建分支/合并分支/切换分支
SVN分支/合并原理及最佳实践

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注