分支的基本概念就正如它的名字,开发的一条线独立于另一条线,如果回顾历史,可以发现两条线分享共同的历史,一个分支总是从一个备份开始的,从那里开始,发展自己独有的历史(如下图所示)⑴创建分支假设目前我们版本库中的项目的布局如下图:如图所示,我们的项目放在了trunk(主线)目录,另外还有branch(分支)和tags(标签)目录,这样的布局是为了更清晰的区别主线、分支和标签三者的位置。subversion对分支和标签是通过复制一份最新的版本库的快照来实现的。开始创建分支:在我们CheckOut的主线目录(trunk)上,右键点击然后选择“Branch/tag…”在弹出的窗口中,将ToUrl指向branch目录并输入分支的具体目录名,这里是mybranch1.0,我们即将创建的分支便存放于此处,点击OK。Update一下本地的branch目录,你就可以看到你刚刚创建的分支“mybranch1.0”,这样一来我们的分支就创建完成了。创建分支的最大的目的就是跟主线进行并行开发的时候不影响主线的开发。因为你在分支上所做的提交都只存于分支上,主线上的Update是看不到分支的修改的。如下图所示,trunk只能看到r344的版本,并看不到r343的版本。(什么时候应该使用分支呢?例如你接到了一个任务,完成这个任务需要三四个人的合作,你们之间需要共享资源,那们就可以创建一个专为这次任务的分支,参与此次任务的人员则在分支上做开发,等完成之后再合并到主线上,才不会出现将实现了一半的不完成功能也提交到主线上,影响主线的正常工作。又或者自己需要一个较长的开发周期来完成任务,这么长的时间内如果一直没有将资源进行提交,万一丢失了就前功尽弃了。当然分支不是只用于此类情况,还有其它很多种情况也能使用分支来达到目的。)使用分支需要注意,由于长期的独立开发,可能会在合并回主线时出现较多的冲突。所以在支线上开发间期如果发现主干有更新,而且这个更新有可能将来跟你产生冲突,那你可以先将主线的内容合并到分支上。已免等到做了大量修改再来更新。(其实此过程跟分支合并到主线上是一样的操作,只是目的地不同。)例如我们在主线上的版本为3,我们如何将此版本的信息合并到分支上呢?在分支的根目录上右键点击,选择“TortoiseSVNMerge…”。在这里我们必需先弄明白一个合并背后的关健概念合并的过程中发生的所有事:首先两个版本库树的比较,然后将区别应用到本地拷贝.这个命令是包括三个参数的:1.初始的版本树2.最终的版本树3一个接收区别的工作拷贝。弄明白这些概念之后我们继续往下操作。在弹出的窗口中,选择主线目录和其版本号(初始的版本树),再选择主线目录和最新的版本号(最终的版本树),这里也可以是某一个版本号但应该比初始的版本树的版本号要高,接收区默认为你右键所指的目录,这里是mybranch1.0。在合并之前我们可以通过点击“Unifieddiff”,查看两版本树之间所有文件的内容的变化,“diff”显示出有发生变化的文件列表,“dryrun”能显示真正合并时的状态信息,但并没有做任何的合并操作。我们点击“Merge”。在点击“Merge”,合并后的文件(即对分支上的文件补上了主线上修改的内容),如无冲突则可以在分支上像其它文件一样使用了,如果合并后的内容不满意,可以通过撤销来取消这次的合并操作,前提是未对合并后的文件做提交操作。分支合并到主线跟从主线上合并内容到分支上类似不同的是1、开始的版本库是分支创建的版本2、结束的版本库是完成所以开发工作之后的版本3、应用的目的是主线目录关于转换工作拷贝、标签(标签在Subversion中跟分支是相同原理的,一个不去做任何的修改的分支就是版本库某一时刻的一个快照,相当于为某一个版本做了一个标签)首先说下为什么我们需要用到分支-合并。比如项目demo下有两个小组,svn下有一个trunk版。由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组1继续完成原来正进行到一半的工作【某个模块】,小组2进行新需求的开发。那么此时,我们就可以为小组2建立一个分支,分支其实就是trunk版【主干线】的一个copy版,不过分支也是具有版本控制功能的,而且是和主干线相互独立的,当然,到最后我们可以通过【合并】功能,将分支合并到trunk上来,从而最后合并为一个项目。下面是在eclipse下使用subeclipse插件详细使用过程:首先建立一个工程,名字叫Facebook1.建立分支,为新的分支指定访问URL:Facebook3[注释不要忘了]2.建立好分之后,使用“切换”功能切换到分支下进行开发。我新建了一个FB3.html的文件并在分支下进行提交。3.切换回trunk版【即URL为Facebook的版本】你会发现trunk版里并没有出现我们刚刚提交的FB3.html,因为FB3.html是属于分支的,接下来我们要做的就是“合并”,通过合并,我们可以将分支下进行的更改合并到trunk版里。下面是合并的主要配置:起始路径:trunk版的路径【若需要把trunk版的改动合并到分支则相反】目标路径:从哪里获取改动【这里是分支路径】你可以使用指定的版本号,这里采用最新修订版。4.点击合并,你会发现trunk版下新增了一个文件FB3.html这样我们就将分支下所做的改动合并到了trunk版里。值得注意的是:1.在建立分支的时候最好添加注释。2.进行合并前最好保证两个版本都是干净的【即没有未提交或者冲突的文件存在】3.合并时的目标路径:需要把谁的改动合并到其他版本就填谁的URL。整个过程的SVN命令行输出如下:1.copy-rHEADsvn://192.168.1.192/placii/staggingarea/xiangqi/Facebooksvn://192.168.1.192/placii/staggingarea/xiangqi/Facebook32.propsetsubclipse:tags1538,Facebook2,/Facebook2,branch3.1540,Facebook3,/Facebook3,branchE:/myeclipse/workspace/Facebook4.switchsvn://192.168.1.192/placii/staggingarea/xiangqi/Facebook3E:/myeclipse/workspace/Facebook-rHEAD5.Atrevision1541.6.add-NE:\myeclipse\workspace\Facebook\WebRoot\FB3.html7.AE:/myeclipse/workspace/Facebook/WebRoot/FB3.html8.commit-mE:/myeclipse/workspace/Facebook/WebRoot/FB3.html9.AddingE:/myeclipse/workspace/Facebook/WebRoot/FB3.html10.Transmittingfiledata...11.Committedrevision1542.12.switchsvn://192.168.1.192/placii/staggingarea/xiangqi/FacebookE:/myeclipse/workspace/Facebook-rHEAD13.DE:/myeclipse/workspace/Facebook/WebRoot/FB3.html14.Updatedtorevision1542.15.=====FileStatistics:=====16.Deleted:117.mergesvn://192.168.1.192/placii/staggingarea/xiangqi/Facebook@HEADsvn://192.168.1.192/placii/staggingarea/xiangqi/Facebook3@HEADE:/myeclipse/workspace/Facebook18.AE:/myeclipse/workspace/Facebook/WebRoot/FB3.html19.Mergecomplete.20.=====FileStatistics:=====21.Added:1希望本文能有所帮助。其他参考资料:===========================关于合并==========================我在合并的时候发现,合并后文件被直接覆盖掉了,而没有出现本该出现的【冲突】,后来经过仔细研究发现,是操作问题。假设我原来的项目是placii,建立了一个分支是placiiStore.现在需要将分支placiiStore合并到主干线上。那配置应该如图所示1.【起始路径】:这里需要填分支的路径。2.第一个修订号:建立分支时的版本号。在建立分支时候记录下svn的console我的是1.copy-rHEADsvn://192.168.1.192/placii/trunk/code/server/source%20code/placiisvn://192.168.1.192/placii/trunk/code/server/source%20code/placiiStore2.propsetsubclipse:tags1527,placiiStore,/sourcecode/placiiStore,branch3.1549,placiiStore,/source%20code/placiiStore,branchE:/myeclipse/workspace/placii4.switchsvn://192.168.1.192/placii/trunk/code/server/sourcecode/placiiStoreE:/myeclipse/workspace/placii-rHEAD5.Atrevision1550.3.目标路径:这里使用起始路径。4.目标版本号:使用最新版即HEAD.点击合并,如果有人在主干线版本上做了更改,而你再分支上也对这个文件作了更改,将会产生冲突。然后手动把冲突的代码合并一下,右键-标记为解决,这就达到我们的目的了。TortoiseSVN中分支和合并实践使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到分支的管理,也不敢贸然使用合并功能,生怕合并出了问题对团队造成不良影响,最主要的原因是,自己对分支的目的和合并的方法不甚了解,这才是硬伤。最近由于适配机型的需要(本人从事手机客户端的开发),需要经常接触分支和合并两项工作,突然发现这玩意整不明白很难开展工作,遂这两天着重研究了一下,有点收获,怕以后忘了,故趁着余温尚在赶紧写下来,好记性不如烂笔头嘛。下文的实践主要是参考了TortoiseSVN的帮助文档和Subversion的在线文档,Subversion的在线文档:话说我公司现在的源代码管理挺乱的,svn目录并没有采取标准的source/branches、source/trunk结构,主线和分支放得到处都是,release版本也并没有当成tag处理,而是当成branch来管理,经常还要在release版本上改来改去。。。先说说什么是branch。按照Subversion的说法,一个branch是某个developmentline(通常是主线也即trunk)的一个拷贝,见下图:branch存在的意义在于,在不干扰trunk的情况下,和trunk并行开发,待开发结束后合并回trunk中,在branch和trunk各自开发的过程中,他们都可以不断地提交自己的修改,从而使得每