[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
如果你认为你新加的功能已经开发完成了,你可以删除你的分支。
[svn] 分支开发的更多相关文章
- svn分支开发与主干合并(branch & merge)
下面我将step by step地演示如何一次完整的branching和merging,包括创建分支.分支开发.分支和主线同步,分支合并到主线的全过程,甚至包括如何在本地创建一个测试用的reposit ...
- svn分支开发注意事项
1.切换的时候最好查看本文件的是主干上的还是分支上的, 单击右键,点击属性,可以看到以下图片,其中"URL"就可以 看到是主干还是分支 2.切换到分支 点击切换后就选择要切换到的路 ...
- SVN多分支开发模式V1.0.1
1目的 规范开发模式过程,指导项目研发.质控测试.DevOps的相关活动. 2适用范围 本规范的作用范围是为互联网软件产品相关项目开发模式的管理过程. (1) 对项目团队中研发人员在开发模式过程中 ...
- SVN分支管理策略个人见解
本篇目录 前言 SVN分支管理策略 VisualSVN Server TortoiseSVN客户端 Repository的创建 Check out trunk创建新项目MyProject trunk更 ...
- SVN分支研究
在结合之前总结的定制开发的产品版本开发问题解决的方法:http://www.cnblogs.com/EasonJim/p/5971906.html,今天来研究以下用SVN处理这类的问题. 研究SVN分 ...
- (转)SVN分支/合并原理及最佳实践
先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...
- eclipse中SVN分支合并到主干
在项目开发中,需要添加一些新的功能,但是又不想影响到其他开发人员的项目进度,所以决定使用SVN分支进行开发,分支开发完毕后再合并到主干.本文介绍如何在eclipse中合并分支到主干. 1. 要想将分支 ...
- 详细说明svn分支与合并---命令行
一,svn分支与合并有什么用? 作程序的,对svn在熟悉不过了,但对svn分支熟悉的,我想并不多.因为一般情况下,是用不着svn分支的,其实也没有那个必要.下面我例举几个需要用到svn分支的情况: 1 ...
- SVN 分支及合并的介绍和实践---命令行
写在前面 一些相关的概念和原理 进行分支开发的最佳实践 合并的分类 在 Eclipse 中进行合并操作 相关资源 写在前面 本文是由演讲整理而来的,介绍了 SVN 分支与合并的概念.流程和一些实际操作 ...
随机推荐
- HDU 3213 Box Relations(拓扑排序构造)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3231 题意:有n个长方体,四种限制条件.(1)I x y x和y有相交:(2)X/Y/Z x y x ...
- [转]Unity 脚本生命周期流程图
渲染 OnPreCull: 在相机剔除场景之前调用此函数.相机可见的对象取决于剔除.OnPreCull 函数调用发生在剔除之前. OnBecameVisible/OnBecameInvisible: ...
- 【原文】前端程序员必须知道的高性能Javascript知识
原文:前端程序员必须知道的高性能Javascript知识 想必大家都知道,JavaScrip是全栈开发语言,浏览器,手机,服务器端都可以看到JS的身影. 本文会分享一些高效的JavaScript的最佳 ...
- Android 布局简要范例
Android的布局决定着实际的UI界面呈现情况,正是这些UI界面的组合与千变万化,才呈现出了各式各样的风格. 而这些基础的布局框架结构很重要,需要玩的很熟悉.我将以前参考的部分代码示例,所做的相关实 ...
- LINQ之路 5:LINQ查询表达式
书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# ...
- iOS - UIImagePickerController
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImagePickerController : UINavigationController <NSCod ...
- MonkeyRunner学习(2)常用命令
目录: 1.截图 2.暂停 (时延秒) 3.屏幕操作 4.打印 5.字符串发送到键盘输入(登录输入) 6.唤醒设备屏幕 7.重起手机 8.按键(系统键) 9.回车键 10.for 循环 11.循环截图 ...
- 构件工具Maven----坐标、依赖、仓库、生命周期的简单学习
这篇文章对Maven中几个比较重要的概念坐标.依赖.仓库.生命周期做一个简单的介绍. 1.关于Maven坐标 用来区别Maven世界中任何一个构件,Maven坐标的元素包括groupId.artifa ...
- JavaWeb学习总结(六)—HttpServletResponse
Response概述: response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse.在客户端发出每个请求时,服务 ...
- Eclipse 设置文件的默认打开方式
web开发中,我们在编辑JSP/xml的时候,会碰到一个非常郁闷的事,直接双击打开的JSP页面,当我们在编辑的时候会到处跳,这个我是深有体会,所以我们就用右击 open with,但是久而久之我们会感 ...