(转)SVN分支/合并原理及最佳实践

摘要:
使用分支从主干创建分支,然后在分支上进行开发,并在开发后将其合并到主干中。就分支机构而言,让我们谈谈合并。话虽如此,但这篇文章似乎快结束了,而不仅仅是分支和合并?为了避免在“错误”的道路上越走越远,branch现在意识到是时候与主干同步了。单击“下一步”后,将出现以下窗口:由于需要从主干到分支进行合并,因此“URLtom”

先说说什么是branch。按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图:

(转)SVN分支/合并原理及最佳实践第1张

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

设想以下场景,如果你的项目需要开发一个新功能,而该功能可能会修改项目中的绝大多数文件,而与此同时,你的另一位同事正在进行bug fix,如果你的新功能不在branch中开发而直接在trunk中开发,那么你极有可能影响另一位同事的bug fix,他/她在bug修复中可能会遇到各种各样的问题,因为你的频繁提交代码引入了过多的不稳定因素。你可能会说,那我在开发的过程中不提交不就行了,等到我全部开发结束我再提交,是,你可以这么做,那还要版本控制干什么呢?也许等到你最后提交代码的时候(也许一周,也许两周?),你会发现有一大堆conflict等着你resolve。。。

那么,正确的做法是什么?使用branch,从trunk创建branch,然后在你的branch上开发,开发完成后再合并到trunk中。

关于branch先讲到这里,下面说说什么叫做合并。很好理解,当branch开发完成后(包括必要的测试),将branch中的修改同步到trunk中,这个过程有可能包括修改文件、增加文件、删除文件等等。

说到这里,貌似本文差不多可以结束了,不就是分支和合并么?只要再简单地说说如何建立分支和如何合并就可以收尾了,可能只需两个命令,也可能只需鼠标点几下然后键盘敲两下即可。其实事情远非这么简单,爱动脑筋的同学可能会问了,将branch的改动merge到trunk的时候,和上文说的直接在trunk中全部开发完然后提交有何区别?你最后还不是要处理一大堆conflict?

这个问题问得非常好,其实这正是本文的重点:branch和trunk在并行开发的过程中如何感知对方,branch如何才能在开发过程中不会和trunk越走越远,导致最后无法合并?试想一下,如果在你开发branch的过程中,trunk中的某个类文件已经被删除了(这可能是另外一个家伙在另一个branch上开发了两周后才合并到trunk的),而你竟然在这个类文件上做了大量修改,试问你到最后合并回trunk的时候该有多蛋疼?解决这一问题的唯一手段是,branch要不停地和trunk保持同步,你要及时地知道trunk都做了什么修改,这些修改是否会影响你正在开发的新功能,如果需要,你必须及时调整branch的代码,使之能与trunk“兼容”。

那么如何让branch和trunk保持同步?合并,从trunk合并到branch,你没听错,是从trunk合并到branch。关于TortoiseSVN的合并,有几点需要注意:

a.TortoiseSVN的合并发生在本地,也即你的working copy中,你无需过多担心会对repository中的代码造成影响

b.不管是从trunk合并到branch还是最终从branch合并回trunk,在每次合并前最好先update,然后将本地的修改先全部commit,保护好现场,万一合并不理想随时都可以revert

c.合并完成后看是否能正确编译,然后测试验证,最后将合并后的改动提交到repository

下面我将step by step地演示如何一次完整的branching和merging,包括创建分支、分支开发、分支和主线同步,分支合并到主线的全过程,甚至包括如何在本地创建一个测试用的repository。

首先需要安装TortoiseSVN,我安装的版本是:TortoiseSVN 1.6.15, Build 21041 - 32 Bit , 2011/03/23 18:00:27

1、本地Repository的创建

repository的创建很简单,假设我要在D:TortoiseSVNTestRepository目录中创建repository,只需右键TestRepository目录,依次选择"TortoiseSVN" -> "Create repository here"便完成了repository的创建。

2、Check out

假设要check out到D:TortoiseSVNTestSVN,同样很简单,在D:TortoiseSVN目录下创建TestSVN目录,然后在该目录上右键,选择"SVN Check out...",在弹出的窗口中的"URL of repository"中填入"file:///D:/TortoiseSVN/TestRepository",其他默认即可,最后点击ok。

3、trunk创建新项目MyProject

相当简单就不赘述了,只列出本次操作所作出的修改:

2、Check out

假设要check out到D:TortoiseSVNTestSVN,同样很简单,在D:TortoiseSVN目录下创建TestSVN目录,然后在该目录上右键,选择"SVN Check out...",在弹出的窗口中的"URL of repository"中填入"file:///D:/TortoiseSVN/TestRepository",其他默认即可,最后点击ok。

3、trunk创建新项目MyProject

相当简单就不赘述了,只列出本次操作所作出的修改:

(转)SVN分支/合并原理及最佳实践第2张

4、创建branch

在/trunk/MyProject目录上右键,依次选择"TortoiseSVN" -> "Branch/tag...",在弹出窗口的"To URL"中填入分支的地址,在这里目标revision选择HEAD revision,如下图所示,添加log后点击ok分支便建立了。这个操作速度非常快,新建的branch在repository中其实只是一个指向trunk某个revision的软连接而已,并没有真的复制文件。

(转)SVN分支/合并原理及最佳实践第3张

5、Check out分支

右键TestSVN目录选择"TortoiseSVN Update"即可将刚刚建立的分支下载回本地。进入/branches/MyProject目录下你会发现其文件结构和/trunk/MyProject一模一样。

6、branch提交一个新文件

(转)SVN分支/合并原理及最佳实践第4张

7、trunk紧接着提交一个修改

(转)SVN分支/合并原理及最佳实践第5张

8、branch再次提交一个修改

(转)SVN分支/合并原理及最佳实践第6张

9、将trunk中的修改同步到branch

6-8演示的是branch和trunk在独立、并行地开发。为了防止在“错误”的道路上越走越远,现在branch意识到是时候和trunk来一次同步了(将trunk合并到branch)。

首先,在本地trunk中先update一下,有冲突的解决冲突,保证trunk和repository已经完全同步,然后在/branches/MyProject上右键,依次选择"TortoiseSVN" -> “Merge...”,在弹出的窗口中选择第一项"Merge a range of revision",这个类型的Merge已经介绍得很清楚,适用于将某个分支或主线上提交的多个revision间的变化合并到另外一个分支上。

(转)SVN分支/合并原理及最佳实践第7张

点击next后,出现如下窗口:

(转)SVN分支/合并原理及最佳实践第8张

由于是要从trunk合并到branch,理所当然这里的"URL to merge from"应该填trunk的路径,"Revision range to merge"很好理解,就是你要将trunk的哪些revision所对应的变化合并到branch中,可以是某一连串的revision,比如4-7,15-HEAD,也可以是某个单独的revision号。由于在r4中,trunk修改了Person.java中的talk()方法,所以这里的revision只需填4即可。点击next后出现下图:

(转)SVN分支/合并原理及最佳实践第9张

在这里只需保留默认设置即可。在点击Merge按钮前你可以先Test merge一把,看成功与否,以及merge的详细信息。点击Merge按钮后trunk所做的修改将同步到branch中。

10、提交合并后的branch

(转)SVN分支/合并原理及最佳实践第10张

至此,branch已经完全和trunk同步,branch和trunk的代码相处很融洽,没有任何冲突,如果branch已经开发结束,那是时候将branch合并回trunk了,当然,如果branch还要继续开发,那你将不断地重复6-10这几个步骤。

11、将branch合并回trunk

在/trunk/MyProject上右键(注意是在主线的目录上右键),依次选择"TortoiseSVN" -> "Merge...",在弹出的窗口中,Merge type选择第二项"Reintegrate a branch",这种类型的合并适合在分支开发结束后将所有的改动合并回主线。

(转)SVN分支/合并原理及最佳实践第11张

点击next后出现如下窗口:

(转)SVN分支/合并原理及最佳实践第12张

在这里,"From URL"选择/branches/MyProject,无需选择revision号,Reintegrate会将branch上所有修改合并到trunk。后面的步骤和上文第9步中的一样,不再啰嗦了。如无意外,branch将成功合并到trunk,你需要做的只是将合并后的trunk赶紧commit!

12、提交合并后的trunk

so easy...

13、删除branch

如果你认为你新加的功能已经开发完成了,你可以删除你的分支

到这里,我已经给你演示完了整个过程,我一身的汗也下来了,我想罢工了,不过最后我们还是看看所有的log信息吧,通过log能发现我们干的所有事情:

(转)SVN分支/合并原理及最佳实践第13张

r1-r7正是我上文在干的事情,从Message中你能发现我对trunk和branch都干了什么,另外,在Log Messages窗口的

左下角勾选了"Include merged revisions"你还能看到额外的Merge information:

(转)SVN分支/合并原理及最佳实践第14张

图中灰色的是和merge相关的log,共发生了两次merge,第一次是在r6,在r6中,branch合并了trunk在r4时提交的变化;第二次是在r7,在r7中,trunk合并了branch从r2到r6的所有变化。

左下角勾选了"Include merged revisions"你还能看到额外的Merge information:

(转)SVN分支/合并原理及最佳实践第14张

图中灰色的是和merge相关的log,共发生了两次merge,第一次是在r6,在r6中,branch合并了trunk在r4时提交的变化;第二次是在r7,在r7中,trunk合并了branch从r2到r6的所有变化。

终于可以写写总结了:

a.branch主要用于新功能的开发

b.合并发生在本地working copy,只要你不提交就不会影响到repository

c.合并前一定要先update、commit,保证不会out of day,并将本地的修改保存到repository

d.branch和trunk并行开发的过程中,要经常同步,将trunk的修改合并到branch,合并时选择"Merge a range of revision"

e.branch最后合并回trunk时,merge type选择"Reintegrate a branch"

免责声明:文章转载自《(转)SVN分支/合并原理及最佳实践》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NLog简单配置与使用【idea】idea编译环境改为1.8下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于 svn: E155004 is already locked 出现原因和解决办法

1.出错提示: svn: E155004 is already locked,please clean up ......... 2.出错原因: SVN本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消。可能会造成本地文件被锁定的情况。 3.解决办法: 1)可以使用SVNcleanup来清除锁定。2)如果不是本目录锁定,系统提示上一层目录锁定,需要...

CruiseControl.Net+SVN+MSBuild+MSTest的自动构建测试环境

才从书上看到CruiseControl.Net,这就是我要的。日常工作中常做这个事,从svn下载源码,开Visual Studio,编译,运行测试。这个工具可以自动完成这一系列工作。还能生成报表,监视svn的改动等。 MSBuild在这个位置:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe...

.Net程序员学用Oracle系列(13):合并语句(MERGE)

1、语法说明 1.1、UPDATE 和 INSERT 可以只出现一个 1.2、UPDATE 后面还可以再跟 WHERE 1.3、UPDATE 和 INSERT 同时出现 1.4、UPDATE 之后还可以再删除行 1.5、将两个列的部分行值互换 2、常见雷区 2.1、ORA-30926: 无法在源表中获得一组稳定的行 2.2、USING 了...

SVN权限配置专家详解,精确到某个目录

本节向大家描述一下SVN权限配置问题,在学习版本控制工具SVN时,了解了SVN权限配置才能更好的对SVN进行操作,欢迎大家一起来学习SVN权限配置方法。 作为一个配置管理员,需要管理用户的权限,本文主要介绍了使用Subversion的授权文件“authz-db”,同时为了叙述的清晰,我首先澄清SVN权限配置的一些概念。 1.认证(Authenticati...

vs2017安装svn插件

1、下载https://www.visualsvn.com/visualsvn/download/ 根据对应的vs版本下载对应的插件 2、关闭你的vs 3、双击下载的VisualSVN-VS2017-6.2.1 .vsix文件 将Visual Studio Professional 2017的选择框勾上,点击安装 4、点击结束任务,等待安装完成 5、打...

Mac git 终端使用

终端有这个提示,这个按照命令 输入你的 git账号和邮箱就可以, 不然一直出这个提示 Your name and email address were configured automatically based on your username and hostname. Please check that they are accurate. Yo...