[svn] 分支开发

时间:2022-09-24 23:49:45
参考博客:
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

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

[svn] 分支开发的更多相关文章

  1. svn分支开发与主干合并(branch & merge)

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

  2. svn分支开发注意事项

    1.切换的时候最好查看本文件的是主干上的还是分支上的, 单击右键,点击属性,可以看到以下图片,其中"URL"就可以 看到是主干还是分支 2.切换到分支 点击切换后就选择要切换到的路 ...

  3. SVN多分支开发模式V1.0.1

    1目的 规范开发模式过程,指导项目研发.质控测试.DevOps的相关活动. 2适用范围 本规范的作用范围是为互联网软件产品相关项目开发模式的管理过程. (1)   对项目团队中研发人员在开发模式过程中 ...

  4. SVN分支管理策略个人见解

    本篇目录 前言 SVN分支管理策略 VisualSVN Server TortoiseSVN客户端 Repository的创建 Check out trunk创建新项目MyProject trunk更 ...

  5. SVN分支研究

    在结合之前总结的定制开发的产品版本开发问题解决的方法:http://www.cnblogs.com/EasonJim/p/5971906.html,今天来研究以下用SVN处理这类的问题. 研究SVN分 ...

  6. (转)SVN分支/合并原理及最佳实践

    先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...

  7. eclipse中SVN分支合并到主干

    在项目开发中,需要添加一些新的功能,但是又不想影响到其他开发人员的项目进度,所以决定使用SVN分支进行开发,分支开发完毕后再合并到主干.本文介绍如何在eclipse中合并分支到主干. 1. 要想将分支 ...

  8. 详细说明svn分支与合并---命令行

    一,svn分支与合并有什么用? 作程序的,对svn在熟悉不过了,但对svn分支熟悉的,我想并不多.因为一般情况下,是用不着svn分支的,其实也没有那个必要.下面我例举几个需要用到svn分支的情况: 1 ...

  9. SVN 分支及合并的介绍和实践---命令行

    写在前面 一些相关的概念和原理 进行分支开发的最佳实践 合并的分类 在 Eclipse 中进行合并操作 相关资源 写在前面 本文是由演讲整理而来的,介绍了 SVN 分支与合并的概念.流程和一些实际操作 ...

随机推荐

  1. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1017  Solved: 599[Submit][S ...

  2. HTML5 manifest离线缓存

    一.基本概念 离线缓存是HTML5新引入的技术,能够让你的Web应用程序指定哪些文件可以缓存在本地,使得你的网络断开时依然可以通过本地的缓存来进行访问浏览. 二.使用方法 1. MIME type 声 ...

  3. 关于打开MTK_SDCARD_SWAP 宏后MTK目前升级方案和 关于打开MTK_SHARED_SDCARD宏后MTK目前升级方案

    如果设置宏MTK_SDCARD_SWAP=yes:默认是优先从外卡获取升级包,外卡没有包,才会去内卡获取!   1.插入外卡,升级包update.zip放入外卡,升级可以成功!   2.插入外卡,升级 ...

  4. Fractal Tree

    尝试使用递归方式实现一棵简单的分形树,给出初始点的坐标,在此基础上根据坐标轴旋转的规则计算出子树干与根节点的坐标关系,依次递归画出左子树干和右子树干,并提供一个递归的深度用于控制画的子树的数目. 在二 ...

  5. C函数及指针学习1

    1 大段程序注释的方法 #if 0#endif 2三字母词 以两个问号 开始的都要注意 3 字面值(常量) 在整型号字面值后加 字符L (long),U(unsigned)说明字符常量 为长整型 或( ...

  6. 冒泡,快排算法之javascript初体验

    引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...

  7. console.log 简写

    console.log 简写 平常代码调试总会用到console.log,但是每次写这么长也是很麻烦,就想着存一个简介一点的变量: 然后就随手写了下面代码: var a = 10; var log = ...

  8. HTML5中meta属性大集合

    1.声明文档的字符编码 <meta charset='utf-8'> 2.声明文档的兼容模式 <meta http-equiv="X-UA-Compatible" ...

  9. 二十三、Hadoop学记笔记————Spark简介与计算模型

    spark优势在于基于内存计算,速度很快,计算的中间结果也缓存在内存,同时spark也支持streaming流运算和sql运算 Mesos是资源管理框架,作为资源管理和任务调度,类似Hadoop中的Y ...

  10. 我的 Sublime Text 2 笔记

    作为aptana死忠粉的我,最近由于工作需要最近开始使用sublime,初次使用,就被其秒开的启动速度,简洁的界面设计,无干扰的信息提示所这幅. 俗话说,工欲善其事必先利其器,作为码农,在开始编码之前 ...