您的位置:首页 > 其它

版本管理-SVN分支,合并,切换

2017-02-20 17:05 369 查看
作者:vuefine

文献: svn帮助文档

您将透过学习一个实际应用SVN 管理项目的例子,深刻体会SVN 中的分支合并切换的概念,应用场景,更加深刻体会它们的作用。

1 分支

1.1 为什么需要分支?



  假定Sally和你都有”calc“这个项目的工作副本(working copies)。并且,你们都有一个/calc/trunk这个工作副本。项目的所有文件都位于子目录,而不是在/calc这个目录下,因为你的团队决定:/calc/trunk是开发工作将来位于的“主线”。

  假如你要实施一个大的软件功能。它将要花费很长一段时间去编码,将要会改动项目中的整个文件。最直接的问题是,你不想要干扰Sally,她要在这个文件目录下修改一些小bugs。她需要这些最新版本的文件始终都能是可用的。假如你一点一点地提交所做的文件,会干扰到Sally。

  有一种方法是,你做等上一两周直到完成后,再commit一次。
4000
但是这样有3个缺点:1)不安全,在这期间你只能提交一次。2)不灵活,只能在一台电脑上有最新文件 3)在这期间,别人看不到你的修改。

  因此,更好的策略是在版本库中,创建自己的分支

  创建分支不会干扰到别人,并且可以有选择性地同小伙伴共享文件。

1.2 创建分支

举例:

  创建一个file协议下的版本库和2个工作副本,分别为you 和 Sally,选择版本库所在路径,然后对you 和 Sally分别做check out,如图所示。在”you”文件夹下,创建calc和paint文件夹,在calc下创建trunk和branches文件夹,在trunk文件夹下创建3个子文件,分别为 a.txt, b.docx, c.png。然后执行add, 并且 commit到版本库。然后在Sally工作副本下,update,这样从TestRepository库中下载下在you中创建的文件系统。



  此时版本库的日志信息,创建文件目录系统用了2次提交(r1,r2)。



  这样文件系统结构如下,你在”you“的工作副本下,选中trunk文件夹,选择创建分支,操作步骤如图所示:

1)选择分支路径:



2)填写日志信息:



3)选择源目录的修改版本,此处选择calc/trunk目录的版本1,即创建3个子文件的提交版本。



4)选择生成中间文件夹,暂不切换工作副本到新的分支(切换会在后面说到!):



5)点击选择OK后,提示创建分支成功,并且会有一个提示信息,如下:



  这个提示告诉我们,工作副本的路径还是在/calc/trunk上,如果想改变到/calc/branches/my-calcbranch,请使用*Switch命令切换(切换会在后面说到!)。

  创建分支之后,在版本库中修改版本号:r3,在my-calbranch文件夹下,update 之后,才从版本库中把位于/calc/trunk下的3个文件下载到my-calbranch文件夹下。

  由此可以推测SVN分支创建后,不会涉及任何文件的复制和传输等,只有update后才从版本库传输到“you”这个工作副本。那么目前”you“的工作副本,文件结构示意图如下图所示。



1.3 在分支上工作

  我们假定本周就要过去了,如下的提交发生:

  你修改了/calc/branches/my-calc-branch/a.txt,生成修订版本 r4。

  你修改了/calc/branches/my-calc-branch/b.docx,生成修订版本 r5。

  Sally修改了/calc/trunk/b.docx,生成了修订版本 r6。

  截至目前,对 TestRepository 版本库所有的修改,如下图所示:



  到“you”这个工作副本/calc/trunk目录下,update一下后,在此工作副本能获取到Sally上交的r6 版本。

  Sally试图去她自己的/calc/trunk目录下update获取r4,r5 修改版本时,发现是徒劳的!trunk和my-calcbranch是两个不同的分支,所以她不能获取到版本 r3,r4。

1.4 分支背后的关键概念

  通过以上应该记住两件事:

1)SVN 的内部实现并没有分支这个概念,SVN 仅知道如何做copy。当你拷贝了一个目录trunk,新出现的结果目录仅仅是一个分支目录my-calcbranch,对SVN而言,它也是一个目录!

2)由于这种copy机制,SVN 的分支在版本库中也是一个普通的文件目录。只不过,大多数的团队约定俗成,把分支都放在branches文件夹,其实分支可以位于任意文件目录。

2 合并

  现在的情况是,你和Sally正工作在不同的分支上:你处在名称为my-calcbranch这个分支上,Sally在trunk 这个分支上。

  当你想要获取Sally的修改版本r6 时,你需要合并它到你的分支上,反之亦然,这个是容易理解的。从某个分支提交内容到另一枝的过程,称为 合并

  好消息是,你合并 r6 到你的分支上时,发现没有冲突。

  但是也有可能,坏消息,你偏离分支太远了,以至于当你合并 r6 到你的分支上时,发现有冲突,或者即便你的分支没有偏离太远,你和Sally同时都修改了b.docx文件(r5 你修改的b.docx,r6 Sally修改的b.docx文件),也有可能发生冲突!

2.1 合并主干修改到分支

  合并主干修改到分支,使得你保持与主干同步。因此,你在my-calcbranch中选择Merge命令,



  合并来自于主干的修改,即 r6 版本:



  合并完成后,发现有冲突,如下图所示,因为你在r5 对 b.docx 做了修改(添加了一行),而Sally在 r6 也对 b.docx 做了修改(添加了一行),都做了修改,就是有可能冲突,此处Test merge发现真的冲突了,

  测试发现冲突,仍然点击merge,出现冲突对话框,手动解决冲突,调整后,提交



2.2 合并分支到主干

  这个过程与“主干合并到分支”过程相似,不再赘述。

3 切换分支

  Switch 命令是指某个文件夹或文件在不同分支间切换工作副本。现在“you”工作副本trunk文件夹及3个子文件在/calc/trunk目录,trunk这个文件夹的工作副本就是自己/calc/trunk,可选择Switch命令查看,



  此时我们不改变这个文件夹的工作副本,看一下/calc/trunk这个文件的修改版本为: r1,r6(没有r2 是因为r2 版本创建了branches文件夹,按理说trunk和branches这2个文件夹应该提交为一个版本)。

  当我们修改To path,切换目录到分支目录,如图所示:



  此时,我们再在calc/trunk这个文件夹上,查看修改版本号,变为r3,r4,r5 。

  比较到这里,相比大家都对Switch有一点体会了吧,是的,当分支由calc/trunk 切换到分支 calc/branches/my-calcbranch 文件夹时,calc/trunk 关联的版本库路径由TestRepository/calc/trunk切换为TestRepository/calc/branches/my-calcbranch; 因此查看calc/trunk文件夹的版本修改变为了r3,r4,r5 。

  如下图所示,calc/branches/my-calc-branch 这个新主干的版本修改情况:



  为了进一步验证switch,我们在calc/trunk/a.txt 中再添加一行,然后commit,to commit的目录自动显示为版本库的/calc/branches/my-calcbranch,因为此时的工作副本是you/calc/branches/my-calcbranch。



  点击OK。提交成功!

  因为提交到了版本库的/calc/branches/my-calcbranch,所以自然而然的,在you/calc/branches/my-bcalcbranch,update一下,可以下载calc/trunk/a.txt中修改的东西。

  这就是在不同的分支间切换工作的情况。记住:

  某个目录的工作副本(you/calc/branches/my-bcalcbranch)与对应版本库的路径文件(版本库/calc/branches/my-calcbranch)紧密相关,当you/calc/trunk关联的版本库由“版本库/calc/trunk”修改为 “版本库/calc/branches/my-calcbranches”时,则此版本库路径拥有了2个工作副本分支。修改任意一个副本分支,并commit后,在另一个都update后便能获取到更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: