[svn] 分支开发

 

参考博客:
http://www.cnblogs.com/cxd4321/archive/2012/07/12/2588110.html

 

(1)为什么要使用SVN分支开发和主干合并?

目的:在SVN下进行版本升级模式的开发

需求1、项目目前已经有比较稳定的版本(release_version_1.0),需要在稳定版本上面做程序的升级
2、升级开发时,可能有10个程序员同时在修改程序,且都需要对绝大多数文件做大部分改动
3、恶心的技术经理说:现在需要把数据库换成hbase,但是没有更改完毕之前依旧保持mysql不变
4、多人频繁提交代码引入了过多的不稳定因素
5、为不同用户客定制不同的版本

目标1、在开发过程中需要保证随时可以切换到指定的版本(1.0/2.0/3.02、最大程度避免程序的肆意修改和较多的冲突
3、程序员间相互的修改不受影响

解决方案:在SVN下进行分支开发与主干合并

 

(2)SVN标准结构

url_of_repository
    |-trunk
        |-cnblogs
    |-tags
        |-cnblogs_release_version_1.0
        |-cnblogs_release_version_1.2
        |-cnblogs_release_version_2.0
    |-branches
        |-cnblogs_update_version_1.2_20151012
        |-cnblogs_update_version_2.0_20151213


解读:

从目录可以看出,目前有三个版本,分别是1.0、1.2、2.0.
其中最新稳定可发布版本是2.0。

目前项目针对1.2和2.0版本在做分支升级开发,1.2版本是从1012开始进行升级,2.0版本是1213开始进行升级维护的。

 

(3)Trunk、Tags、Branches详细解读

① trunk[主干]

任何时候,应该保证trunk里面的代码是最新的稳定版本
当branch里面修改的代码经过多次测试成功通过后,应该把branch里面的代码合并到主干trunk里

② tags[存储阶段性的发布版本]

将某时刻认为稳定的最新版本作为一个备份保存在tags目录下,以便随时切换到该稳定节点版本
作为一个里程碑的版本进行存档
注意:tags下面的版本文件默认是只读的(可以强制修改),但还是建议不要修改tags下面的任何文件。

常常听项目经理说:
A.嗯,不错。这个版本比较稳定,给打个2.0版本极限吧。
B.有没有搞错,这个版本这么多错误还敢上线!赶紧给我回退到上一个版本!

相对应的操作是:
A.将当前trunk里的代码"复制"一份到tags下面(cnblogs_release_version_2.0),并注明这个版本的更新和修改情况
B.忽略本次发布版本(cnblogs_release_version_2.0),将系统回退到上一个经测试验证后比较稳定的版本(cnblogs_release_version_1.2)

③ branches[分支]

一个branch是某个 trunk 的一个拷贝
新建的branch在repository中其实只是一个指向trunk某个revision的软连接而已,并没有真的复制文件。

流程:从trunk创建(create)branch,然后在branch上做开发,开发完毕后合并(merge)到trunk中。

项目经理把小李子和小叶子叫过来说:
你们负责的模块都有不同程度的问题,需要修改一下。
但是我不想让你们在trunk里面直接修改,你们回头各自创建一个branch,分别修改完自己的bug再合并到trunk里面吧

1)一个重要问题:branch和trunk在并行开发的过程中如何感知对方,避免两者越走越远,导致最后无法合并?
解决这一问题的唯一手段是:branch要不停地和trunk保持同步,你要及时地知道trunk都做了什么修改,这些修改是否会影响你正在开发的新功能,如果需要,你必须及时调整branch的代码,使之能与trunk“兼容”。

2)那么如何让branch和trunk保持同步?合并,从trunk合并到branch,你没听错,是从trunk合并到branch。

关于TortoiseSVN的合并,有几点需要注意:

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

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

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

 

(4)Branch和Merge具体执行流程

① 创建Branch/Tag

在/trunk/MyProject目录上右键,选择“分支/标记”,在弹出框中的"ToURL"中填入分支/标记的地址,
在这里目标revision选择HEAD revision。添加log后点击ok分支/标记便建立了。

② 检出(Check Out)或者切换(Switch)到分支,在分支中做修改

③ 将trunk中的修改同步到branch

首先,保证此时trunk中的代码是最新的,没有任何冲突。(该Commit的和Update的都已经执行完毕)

"Merge a range of revision" - 将某个分支或主线上提交的多个revision间的变化合并到另外一个分支上。

当branch和trunk在独立、并行地开发时,为了防止在“错误”的道路上越走越远,branch意识到是时将trunk合并到branch了。

trunk先Update至最新代码,在
/branches/MyProject上右键,选择Merge选项,选择"Merge a range of revision"。

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

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

至此,branch已经完全和trunk同步,branch和trunk的代码相处很融洽,没有任何冲突。

④ 将branch合并回trunk

首先,需要保证此时branches中的代码是最新的,没有任何冲突。(该Commit的和Update的都已经执行完毕)

"Reintegrate a branch" - 在分支开发结束后将所有的改动合并回主线。

在/trunk/MyProject上右键,选择“Merge”,在弹出的窗口中,Merge type选择"Reintegrate a branch"

最后,需要将成功合并后的trunk赶紧commit!

⑤ 删除branch

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

 

posted @ 2015-12-21 14:36  Aviva_ye  阅读(1463)  评论(0编辑  收藏  举报