[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.0) 2、最大程度避免程序的肆意修改和较多的冲突 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
如果你认为你新加的功能已经开发完成了,你可以删除你的分支。