大家都知道,SVN是很多公司管理代码的版本控制工具,当分支越来越多,版本迭代越来越频繁的时候,经常会出现代码冲突的头疼事儿,这里讲一下鲨鱼遇到过关于代码版本控制的一些事,最后做个小例子,看图描述。

为什么要用主干,分支的开发方式呢?

我认为使用主干,分支的开发模式,有两个好处。

一是各需求的开发环境独立,不相互影响,对于项目经理规划版本,将版本功能粒度化,分派开发工作,主干的主功能开发和一些临时紧急缺陷需要修复上线不受影响。

二是代码通过合并的方式可以减少代码相互覆盖,这里为什么说是减少而不是说避免呢,因为实践中总是告诉我们现实并不总是那么理想的。

举个例子,我曾经任职的一家公司,代码是导出差异包,加上配置文档提交给测试去覆盖主干代码来打包测试的。有几十号开发人员,每个版本十来个需求,每个需求提一个差异包过来,总共就十来个压缩包,一一解压覆盖到工程中,对着配置文档一一添加或修改配置,然后编译打包部署测试。这过程中,如果有不同的压缩包里面都存在修改了相同一个文件,就会被后面解压覆盖掉前面的文件。这两个开发开发的过程中并不知道其他人也要修改这个文件,所以问题就来了。覆盖了怎么办,退回去让他们一起协商提供一个最新的文件么,这个过程中,其他的需求怎么办,重新覆盖打包么?这是一段很坑爹的经历,真的是很奇葩,但是确实存在着。

后来实在受不了了,开始改变这种开发方式,采取主干,分支的开发方式。以后就不用打包人员去根据配置文档配置,覆盖代码了。每个需求提交一个开发分支过来,将开发分支合并到测试分支进行测试。合并并不是覆盖,svn很智能的识别哪些文件是否存在冲突,如果有冲突会弹出冲突框进行文件对比来解决冲突。如果没有改动过的代码,是不会进行覆盖的,效率就提上来了,而且能看到某个开发修改了哪个文件,遇到问题可以找到提交改代码的开发进行处理。

还有曾任职的一家公司,是使用PHP的,开发人员很干脆的直接在服务器上正在运行的主干代码上vim。修改马上生效确实方便,直接给测试去测。但是这种情况有两个开发同时在上面开发需求就够呛了。一是A根据它的需求改了a.php代码,B又在同一个文件a.php上面相同的位置根据它的需求改了。都不知道对方的情况,瞎了。二是A的需求测试通过后,需要等B的需求也同样测试通过才能上线,还不能回滚,版本控制功能等于摆设。

我觉得比较正能量的是曾任职的一家公司,是用git的,也是主干分支的开发方式,是严格按照版本规划上线的,一不会上线前拆代码,二不会同时进行两个版本的开发,本身就是自研的产品,没有那么多后面叽叽歪歪的需求要求,每个开发负责一个版本的一个小功能,一个分支。开发完后集成到主干自测,最后自测通过后,等各开发各自的功能都完成后一一集成,版本开发完成后,提供主干一个版本号RC1,测试人员根据版本号检出代码打包部署测试,测试完一轮后提交bug报告,bug修复后,提供第二轮测试版本号RC2,测试人员进行第二轮测试。测试通过后测试人员将RC2的包部署到正式环境。

SVN 操作小实践:设定A开发直接在trunk上开发,B开发在branch上开发。

一,初始化trunk

a.php

b.php

二:从主干trunk上迁出开发分支branch_b1,将branch_b1检下来导入工程进行开发

场景一:A,B各自新增不同文件,开发完成后,branch_b1合并到trunk

主干上新增c.php,分支上新增d.php

合并结果:正常! 在主干上,将分支上的差异作用到主干工作副本。

提交trunk代码,上线发布V1

【上载后,branch_b1 中并没有主干新增的代码c.php  一般情况下,分支代码上线后,B需要重新迁分支开发】

 

场景二:A,B同时修改a.php,但是修改位置不同,如A修改方法a1(),B重新迁分支branch_b2,新增方法a2().

trunk与branch_b2修改分别如:

 

将branch_b2合并到trunk:

合并结果:正常!没有冲突,trunk和branch_b2的修改都更新到了trunk工作副本。妥妥的!

提交trunk代码,上线发布V2

场景三:上载后,如果B不重新迁分支开发,继续使用branch_b2,且不把主干代码合并到开发分支 则branch_b2开发分支中并没有方法a1修改的内容,如果这个版本中,B在分支上大量修改方法a1,且多处引用a1,悲剧发生。B修改如下:

branch_b2开发完毕,合并到trunk

合并过程并没有提示冲突,B很开心,下班了。其实结果是错误的!!

合并结果:错误!!! branch_b2修改的内容更新到了trunk工作副本,但是很明显,合并后出现问题了。branch_b2大量修改了旧代码,而不知道a1方法其实已经在上个版本已经被修改了。

场景四:假如上载后,如果B反向合并,将trunk上的代码反向合并到branch_b2,使开发分支与trunk同步,则会怎样呢?

1.先将trunk本地副本全部删除,update线上版本下来。

2.branch_b2 合并trunk

手动解决冲突

解决冲突,合并后,branch_b2会发现,a1方法被修改了。这时候本地可以提前发现问题,重新修改branch_b2使之兼容主干。

修改a2方法,如

准备提测上线了,重新合并到trunk。

合并结果:正常! 没有冲突,合并妥妥的,结果也正确!但是建议上线后重新迁分支做新需求的开发,如果该分支在当前版本无法上线,那在trunk提交后,必须将开发分支与trunk同步,不然会走到越来越远,到最后上线前合并会出现很多无法避免的错误。

SVN合并操作实践的更多相关文章

  1. eclipse svn分支与合并操作

    以前做项目的时候没有用过svn的分支合并操作,今天用到了,刚开始还真不会啊.最后查了下就是这么的方便.专门记录下来. 原文来自:http://blog.csdn.net/lisq037/article ...

  2. SVN SVN合并(Merge)与拉取分支(Branch/tag)操作简介

    SVN合并(Merge)与拉取分支(Branch/tag)操作简介 合并(Merge) 例子:把对feature_branch\project_name_v3.3.7_branch的修改合并到deve ...

  3. svn打分支和合并操作

    1.svn打分支 到trunk里,选择Branch/tag.... 填写分支版本路径 到branch里svn up 一下,就有1.4.0分支了 2.svn合并 到trunk里,选择Merge.. 选择 ...

  4. 关于SVN的操作批处理示例

    关于SVN的操作批处理示例 为了一句话:不要动手做机器能够做的事情. 天天工作用svn,更新啥的打开目录啥的动作天天在重复.每次写些命令也蛮无聊的,不说了,看下面: 1 @echo off 2 rem ...

  5. LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。

    Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...

  6. Git分支中的远程操作实践

    Git分支中的远程操作实践 前几篇博客陆陆续续的讲了好多关于Git操作的内容, 其中在上篇博客聊了<Git中的merge.rebase.cherry-pick以及交互式rebase>,本篇 ...

  7. Squid 操作实践

    Squid简介 Squid可以做什么 性能要素 Squid安装 Squid快速体验 Squid配置 Squid简介 Squid is a caching proxy for the Web suppo ...

  8. 如何利用SVN合并代码

    一.  背景     平时在进行开发时,一般都会有多版本同时进行,包括项目版本.周版本.紧急版本等,当某一个版本具备上线条件后,需要在上一个已发布的版本基础上进行发布,才能够避免出现版本相互覆盖,因此 ...

  9. C#文件的拆分与合并操作示例

    C#文件的拆分与合并操作示例代码. 全局变量定义 ;//文件大小 //拆分.合并的文件数 int count; FileInfo splitFile; string splitFliePath; Fi ...

随机推荐

  1. ES6 变量的解构赋值

    数组的解构赋值     var [a,b,c] = [1,2,3];    左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...

  2. Java 代码编译和执行的整个过程

    Java 代码编译是由 Java 源码编译器来完成,流程图如下所示: Java 字节码的执行是由 JVM 执行引擎来完成,流程图如下所示: Java 代码编译和执行的整个过程包含了以下三个重要的机制: ...

  3. 关于js中"window.location.href"、"location.href"、"parent.location.href"、"top.location.href"的用法

    location.href 和 window.location.href 区别: 1.location.href 可以直接跳转其他地址(不属于本项目) 也可以跳转本项目中的 2.window.loca ...

  4. matplotlib 和 pandas 两个包的安装

    matplotlib是强大的python 绘图包.pandas 是强大的python分析工具包.numpy是强大的python统计包. 都超级好用,而且最近开始动手实践机器学习算法了.特此备注一下安装 ...

  5. Spark 常用参数及调优

    spark streaming 调优的几个角度: 高效地利用集群资源减少批数据的处理时间 设置正确的批容量(size),使数据的处理速度能够赶上数据的接收速度 内存调优 Spark SQL 可以通过调 ...

  6. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

  7. 【BZOJ-3573】米特运输 树形DP

    3573: [Hnoi2014]米特运输 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1023  Solved: 604[Submit][Statu ...

  8. Chrome编辑了样式或者JS之后自动同步回本地工程

    比如我用HBuilder进行调试,在Chrome上修改了几个样式,我们通常的做法是,拷贝修改后的地方,然后再进行覆盖. 现在有了全自动的操作,在Chrome上修改了样式之后,通过Sources的Sav ...

  9. POJ3273 Monthly Expense

    查看原题 边界,就是边界和思维,怎么有效的判断中间值是大了还是小了,以及准确的找到边界!一个<写成<=就前功尽弃,还特别难找到错误! #include <cstdio> #in ...

  10. 加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 1 The Two Fundamental Rules (1.5-1.6)

    Stat2.2x Probability(概率)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...