svn分支创建说明精.docx

上传人:b****5 文档编号:28242815 上传时间:2023-07-09 格式:DOCX 页数:21 大小:1.25MB
下载 相关 举报
svn分支创建说明精.docx_第1页
第1页 / 共21页
svn分支创建说明精.docx_第2页
第2页 / 共21页
svn分支创建说明精.docx_第3页
第3页 / 共21页
svn分支创建说明精.docx_第4页
第4页 / 共21页
svn分支创建说明精.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

svn分支创建说明精.docx

《svn分支创建说明精.docx》由会员分享,可在线阅读,更多相关《svn分支创建说明精.docx(21页珍藏版)》请在冰豆网上搜索。

svn分支创建说明精.docx

svn分支创建说明精

分支的基本概念就正如它的名字,开发的一条线独立于另一条线,如果回顾历史,可以发现两条线分享共同的历史,一个分支总是从一个备份开始的,从那里开始,发展自己独有的历史(如下图所示)

⑴创建分支

假设目前我们版本库中的项目的布局如下图:

如图所示,我们的项目放在了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插件详细使用过程:

首先建立一个工程,名字叫Facebook

1.建立分支,为新的分支指定访问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/Facebook3

2.propsetsubclipse:

tags"1538,Facebook2

/Facebook2,branch

3.1540,Facebook3,/Facebook3,branch"E:

/m

yeclipse/workspace/Facebook

4.switchsvn:

//192.168.1.192/placii/stag

gingarea/xiangqi/Facebook3E:

/myeclipse/workspace/Facebook-rHEAD

5.Atrevision1541.

6.add-NE:

\myeclipse\workspace\Facebook

\WebRoot\FB3.html

7.AE:

/myeclipse/workspace/F

acebook/WebRoot/FB3.html

8.commit-m""E:

/myeclipse/workspace/Fa

cebook/WebRoot/FB3.html

9.AddingE:

/myeclipse/worksp

ace/Facebook/WebRoot/FB3.html

10.Transmittingfiledata...

11.Committedrevision1542.

12.switchsvn:

//192.168.1.192/placii/stag

gingarea/xiangqi/FacebookE:

/myeclipse/workspace/Facebook-rHEAD

13.DE:

/myeclipse/workspace/Facebook

/WebRoot/FB3.html

14.Updatedtorevision1542.

15.=====FileStatistics:

=====

16.Deleted:

1

17.mergesvn:

//192.168.1.192/placii/stagg

ingarea/xiangqi/Facebook@HEADsvn:

//19

2.168.1.192/placii/staggingarea/xiangqi/Facebook3@HEADE:

/myeclipse/workspace/Facebook

18.AE:

/myeclipse/workspace/Facebook

/WebRoot/FB3.html

19.Mergecomplete.

20.=====FileStatistics:

=====

21.Added:

1

希望本文能有所帮助。

其他参考资料:

c

===========================关于合并

==========================

我在合并的时候发现,合并后文件被直接覆盖掉了,而没有出现本该出现的【冲突】,后来经过仔细研究发现,是操作问题。

假设我原来的项目是placii,建立了一个分支是placiiStore.现在需要将分支placiiStore合并到主干线上。

那配置应该如图所示

1.【起始路径】:

这里需要填分支的路径。

2.第一个修订号:

建立分支时的版本号。

在建立分支时候记录下svn的console

我的是

1.copy-rHEADsvn:

//192.168.1.192/placii

/trunk/code/server/source%20code/placi

isvn:

//192.168.1.192/placii/trunk/cod

e/server/source%20code/placiiStore

2.propsetsubclipse:

tags"1527,placiiSto

re,/sourcecode/placiiStore,branch

3.1549,placiiStore,/source%20code/placii

Store,branch"E:

/myeclipse/workspace/p

lacii

4.switchsvn:

//192.168.1.192/placii/trun

k/code/server/sourcecode/placiiStore

E:

/myeclipse/workspace/placii-rHEAD

5.Atrevision1550.

3.目标路径:

这里使用起始路径。

4.目标版本号:

使用最新版即HEAD.

点击合并,如果有人在主干线版本上做了更改,而你再分支上也对这个文件作了更改,将会产生冲突。

然后手动把冲突的代码合并一下,右键-标记为解决,这就达到我们的目的了。

TortoiseSVN中分支和合并实践

使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到分支的管理,也不敢贸然使用合并功能,生怕合并出了问题对团队造成不良影响,最主要的原因是,自己对分支的目的和合并的方法不甚了解,这才是硬伤。

最近由于适配机型的需要(本人从事手机客户端的开发),需要经常接触分支和合并两项工作,突然发现这玩意整不明白很难开展工作,遂这两天着重研究了一下,有点收获,怕以后忘了,故趁着余温尚在赶紧写下来,好记性不如烂笔头嘛。

下文的实践主要是参考了TortoiseSVN的帮助文档和Subversion的在线文档,Subversion的在线文档:

http:

//svnbook.red-

话说我公司现在的源代码管理挺乱的,svn目录并没有采取标准的source/branches、

source/trunk结构,主线和分支放得到处都是,release版本也并没有当成tag处理,而是当成branch来管理,经常还要在release版本上改来改去。

先说说什么是branch。

按照Subversion

的说法,一个branch是某个developmentline(通常是主线也即trunk)的一个拷贝,见下图:

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

设想以下场景,如果你的项目需要开发一个新功能,而该功能可能会修改项目中的绝大多数文件,而与此同时,你的另一位同事正在进行bugfix,如果你的新功能不在branch中开发而直接在trunk中开发,那么你极有可能影响另一位同事的bugfix,他/她在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的合并,有几点需要注意:

∙TortoiseSVN的合并发生在本地,也即你的workingcopy中,你无需过多担心会

对repository中的代码造成影响

∙不管是从trunk合并到branch还是最终从branch合并回trunk,在每次合并前最

好先update,然后将本地的修改先全部commit,保护好现场,万一合并不理想随时都可以revert

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

repository

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

首先需要安装TortoiseSVN,我安装的版本是:

TortoiseSVN1.6.15,Build21041-32Bit,

2011/03/2318:

00:

27

1、本地Repository的创建

repository的创建很简单,假设我要在D:

\TortoiseSVN\TestRepository目录中创建

repository,只需右键TestRepository目录,依次选择"TortoiseSVN"->"Createrepositoryhere"便完成了repository的创建。

2、Checkout

假设要checkout到D:

\TortoiseSVN\TestSVN,同样很简单,在D:

\TortoiseSVN目录下创建TestSVN目录,然后在该目录上右键,选择"SVNCheckout...",在弹出的窗口中的"URLofrepository"中填入"file:

///D:

/TortoiseSVN/TestRepository",其他默认即可,最后点击ok。

3、trunk创建新项目MyProject

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

4、创建branch

在/trunk/MyProject目录上右键,依次选择"TortoiseSVN"->"Branch/tag...",在弹出窗口的"ToURL"

中填入分支的地址,在这里目标revision选择HEADrevision,如下图所示,添加log后点击ok分支便建立了。

这个操作速度非常快,新建的branch在repository中其实只是一个指向trunk某个revision的软连接而已,并没有真的复制文件。

5、Checkout分支

右键TestSVN目录选择"TortoiseSVNUpdate"即可将刚刚建立的分支下载回本地。

进入/branches/MyProject目录下你会发现其文件结构和/trunk/MyProject一模一样。

6、branch提交一个新文件

7、

trunk紧接着提交一个修改

8、branch再次提交一个修改

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

6-8演示的是branch和trunk在独立、并行地开发。

为了防止在“错误”的道路上越走越远,现在branch意识到是时候和trunk来一次同步了(将trunk合并到branch)。

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

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

由于是要从trunk合并到branch,理所当然这里的"URLtomergefrom"应该填trunk的路径,"Revisionrangetomerge"很好理解,就是你要将trunk的哪些revision所对应的变化合并到branch中,可以是某一连串的revision,比如4-7,15-HEAD,也可以是某个单独的revision号。

由于在r4中,trunk修改了Person.java中的talk()方法,所以这里的revision只需填4即可。

点击next后出现下图:

在这里只需保留默认设置即可。

在点击

Merge按钮前你可以先Testmerge一把,看成功与否,以及merge的详细信息。

点击Merge按钮后trunk所做的修改将同步到branch中。

10、提交合并后的branch

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

11、将branch合并回trunk

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

点击next后出现如下窗口:

在这里,"FromURL"选择/branches/MyProject,无需选择revision号,Reintegrate会将branch上所有修改合并到trunk。

后面的步骤和上文第9步中的一样,不再啰嗦了。

如无意外,branch将成功合并到trunk,你需要做的只是将合并后的trunk赶紧commit!

12、提交合并后的trunk

soeasy...

13、删除branch

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

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

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

在LogMessages

窗口的左下角勾选了"Includemergedrevisions"你还能看到额外的Mergeinformation:

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

终于可以写写总结了:

branch主要用于新功能的开发

∙合并发生在本地workingcopy,只要你不提交就不会影响到repository∙合并前一定要先update、commit,保证不会outofday,并将本地的修改保存到

repository

∙branch和trunk并行开发的过程中,要经常同步,将trunk的修改合并到branch,

合并时选择"Mergearangeofrevision"∙branch最后合并回trunk时,mergetype选择"Reintegrateabranch"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1