今天组内新来的一个同事问我代码提交频率的问题,他在上家公司是一个模块功能开发自测完成后再提交。而我这边采用的是最少一天提交一次,提倡粒度较小的提交, 而且是基于主干开发。采用这种方式是出于以下几点考虑:

1. 提交的粒度小,和别人冲突的可能性就小,避免代码冲突合并的痛苦。

2. 所有的开发都能看到最新的代码,在多模块协同开发的时候,可以及时的了解别人的进度,也是潜在的一个沟通方式。

3 .及时的发现问题,相对于每次提交上千行代码,几十个模块或方法,小粒度的提交倒逼开发及时的单元测试,有利于尽早的发现缺陷,而不是大海捞针般单步调试老长老长的代码。

4 .持续构建和持续发布,持续集成系统对提交的代码会自动进行静态扫描,定时的进行编译和构建,小粒度的提交能够及时的发现一些编译上或规范上的问题。

5 .代码安全,这种可能性虽然小 但也不能排除,尤其是核心模块的代码,辛辛苦苦好几天,硬盘损坏或电脑丢失就回到解放前。

6 .关于小粒度提交和主干开发,可能比较担心的就是上线问题,b需求还没开发完成,但a需求已经要求上线了,或者a模块上线后发现bug怎么办,关于这点,我的考虑是:

  • 我们的开发和迭代比较快,基本是以周为单位,需求的粒度拆分的也会比较小和独立,所以两个需求的代码相互影响会比较小。

  • 需求的可控性较好,我们的需求更多是内部的,压力没那么大,可以做较好的规划,说白了就是商量的余地比较大,因此冲突的可能性就小很多。

  • 如果真出现冲突,就得需要将b需求的功能巧妙的隐藏起来,灵活的配置,灰度发布等。

总的来说我觉得这种方式适合比较敏捷的项目,对代码的结构和需求的管理要求比较高。另外不代表完全拒绝分支,遇到重大的功能修改时, 或者紧急修复线上问题的时候还是要拉分支的,只不过分支的战线尽量短。

关于SVN代码提交粒度和频率的思考的更多相关文章

  1. SVN代码提交冲突解决方案

    SVN代码提交冲突解决方案 1.若你的代码被其他人修改并提交过了,期间你自己也修改过该文件,UPDATE的时候自己代码被覆盖. 右键——>显示日志 查看该文件的更新记录 找到需恢复的版本 右键— ...

  2. 统计svn 代码提交情况

    统计svn代码提交,使用工具 statsvn.jar 下载地址:http://sourceforge.net/projects/statsvn/ rem 声明一个时间变量 作为文件名 %time:~, ...

  3. Eclipse svn代码提交冲突

    Eclipse svn代码提交冲突(转) 1.Synchronize视图下查看代码冲突 1.Incoming Mode 全部update,更新到本地2.Outgoing Mode 全部commit,提 ...

  4. SVN代码提交

    SVN代码提交(转载) 原文链接:http://www.softown.cn/post/100.html 1.SVN代码提交 1) 原则 先更新再提交: SVN是为了多人协同开发而产生的,如果你在提交 ...

  5. 【LINUX】SVN 代码提交之后。同步到web目录下

    1  当你使用svn在成功提交一个新版本的时候,svn仓库目录下的hook文件夹下的post-commit脚本会运行 用shell写一个脚本,在提交完版本后,自动在web目录运行一下svn updat ...

  6. svn代码提交注意事项

    先全部add,查看是否有gen和bin,然后再忽略这两个,忽略时选择最后rescury....

  7. svn代码冲突

    转自:https://blog.csdn.net/pengweid/article/details/49821117 svn代码提交报以下错误,错误原因: [MenuUCCImpl] 代码冲突 org ...

  8. Subversion代码提交中的org.apache.subversion.javahl.ClientException: svn: E200007: Commit failed异常解决

    : 在切换subversion服务器地址之后,发生的无法正确提交代码的问题org.apache.subversion.javahl.ClientException: svn: E200007: Com ...

  9. xcode 把项目代码提交到远程SVN服务器

    环境 xcode 7  Mac air xcode默认支持GIT源码管理工具,但现在想把代码提交到已有到SVN服务器上,步骤如下: 1,在safari中打开svn链接地址,信任证书,输入用户名密码 , ...

随机推荐

  1. C# List根据某一字段排序 将字段相同的排序到一起

    List<JZJLXQ_Prescription_Item> ciList = new List<JZJLXQ_Prescription_Item>(); List<JZ ...

  2. 原生JS中常用的Window和DOM对象操作汇总

    一.常用的Window对象操作 Window对象中又包含了document.history.location.Navigator和screen几个对象,每个对象又有自己的属性方法,这里window可以 ...

  3. POJ 2431 Expedition(优先队列、贪心)

    题目链接: 传送门 Expedition Time Limit: 1000MS     Memory Limit: 65536K 题目描述 驾驶一辆卡车行驶L单位距离.最开始有P单位的汽油.卡车每开1 ...

  4. Java垃圾收集学习笔记

    (1)除了释放不再被引用的对象,垃圾收集器还要处理 堆碎块 .请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的空闲空间是足够的,但是堆中没有没有连续的空间放得下新对象.可能会导致虚拟机产生不 ...

  5. OpenGLES入门笔记二

    #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> #import <OpenGLES/ES2/gl.h& ...

  6. Maven中的dependencyManagement 意义

    1.在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器. 2.pom.xml文件中,jar的版本判断的两种途径 1:如果dependenci ...

  7. glade2支持C++代码的输出(2)

    今天更新了一个BaseObject的代码:BaseObject.002.zip 同时将glade2生成C++代码的代码进行了调整,基于2.12.2的补丁为:cpp_out_2.patch.tar.xz ...

  8. hbase shell command

    进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成 ...

  9. Oracle 的表备份的方法

    1.直接备份(防止误操作后数据库表不能恢复) create table new_table as select * from old_table; 2.创建表头,然后插入列(繁琐的做法) create ...

  10. C# LIST列表的使用

    1.  List的基础.常用方法: 声明: 1.List<T> mList = new List<T>(); T为列表中元素类型,现在以string类型作为例子 E.g.: L ...