封面

作为一名85后的技术男,一转眼10年过去了(一不小心暴露了年龄,虽然我叫18岁fantasy),亲手写代码已经是5年前了,目前主要负责公司的软件产品的规划和设计(所以最近写的东西也主要与设计和产品分析有关)并带着研发团队进行产品落地。偶尔手痒痒写点代码或者和团队讨论一下架构设计啥的,毕竟以前是那么的热爱!

这篇文章主要想写写我所在团队git的使用历程,有些算是回忆吧。~老司机共勉啊~

SVN时代

在刚进公司的时候,那会大家都还在使用svn。代码,原型设计和过程文档都在svn上。大概过了一年,整合svn大小40个G(大概两个千万级项目的代码和文档),每次更新要人命,也给实施团队和方案团队带来了很多困惑,后来就直接把研发从svn上分出来了,但还是svn管理,svn只用来做内部文档管理。

那个时候主要面对项目开发,团队也比较集中,都在北京,项目的特征就是一次性交付,后面有部分变更开发和bug修改。所以从分支上来说基本上就是这样的。

单项目svn

大家都在主分支上开发,然后定时提交,到了上线节点QA把代码checkout下来开始测试。测试完后把bug清单发给研发,研发一顿改,之后提交,QA再回归测试,基本上没问题然后就上线了。

暴露问题:

随着时间的发展,大家有不少时间花在解决冲突上,因为其他人提交了有bug的代码(团队有要求必须自测后提交但,但是自测能力参差不齐),有时候量大了能折腾一上午,基本上最后提交之前都得先本地备份一下,生怕应为冲突而代码丢失了。

引入GIT

随着业务的扩展和团队的发展,北京,武汉,长春都有了研发基地,这种扯皮的事情更多了,并且由于网络的不稳定,很多时候代码提交都出现了问题,通过内部沟通研究,决定将代码管理从svn迁移到公网码云(gitee)上,当时也研究了github之类的。最好考虑还是用了国内的,毕竟还有社区啥的,平时吐个槽看个科技前言新闻也方便。

上了git之后,一开始也只解决了地域问题,大家可以在各自的城市畅通无阻的提交代码了,同时团队也加强了代码审核和自测培训。但是基本上没有分支的概念,那个时候,GIT的使用是这样的。

gitc之初

此阶段解决的问题:

分布式团队,分布式提交。

产生的问题:由于团队要求每天代码必须提交到远程。但是自测结果任然具有不确定,bug还是满天飞,每天一来还是要处理冲突。

引入分支

通过团队讨论,代码每天下班远程提交是必须的,为了防止影响别人,就引入个人分支(团队任务基本上按人按模块分工,前后端不分离),于是就给了每个人或者开发同一个模块的几个人建一个分支(如果同一个分支几个人之间有小矛盾内部自己解决吧),那个时候起名一般按照“项目名_模块名”起名,比如:dxplat_logmgr(下文暂时用git的专用名称feature代替)。每天写完代码,如果还没完成就先提交,然后确定测试完之后再合并到主分支。

引入分支

解决的问题:

可按地域分布式提交。

可远程提交到自己的分支,不影响主分支。

产生的问题:

项目上线后,一个项目实施(简称A)完之后,另外一个相同业务的项目(B)也中标了,但是需求还不尽相同。并且A项目在质保期,还得修修改改,添添补补。怎么能同时满足这两个项目并发升级上线呢。如果按照以前的方法,就是管你A和B,我就是一个工程,然后最后都是打一个包给你(说到这很多人应该有同感),同时包含A+B。实施人员你去部署吧,上线配置小心点改,A项目改A的参数,B项目改B的参数。

随着时间的推移,同业务域定制的项目越来越多,这样下去不是办法,由于上线时间不一致,主分支都不敢随便提交了,QA正在测试A项目的时候B项目也催的着急,也得提交代码让另外一个AQ测试啊。而且代码也慢慢失控了,改起来别提多费劲了,各种依赖包整的项目臃肿的不行不行的了。

引入release分支

团队讨论之后,决定引入release分支,一个项目上线后,通过master建立release分支用来支撑不同需求的项目,定时选择性的将不同项目里面的模块合并到master,开发人员都基于release做开发,并且这个release会一直保留,因为用户永远都有小心思。同时新的项目来了之后都从mater再创建release去应付新的定制需求。整个开发流程变成下面的情况:

release

至此这个策略用了至少2年,一直坚持在用。并且对待项目型的开发总体感觉用着还行,网上有人说少了dev分支,团队内部讨论整体感觉对项目型没必要再搞个dev分支,因为项目基本上是瀑布式开发直到上线,中间迭代上先次数基本很少,要上线也是所有需求满足直接上先。但是最后还是用上了。

接着往下发展~

终于公司部分业务产品化了,也面向公众和企业用户了。需求也多了,面对竞争对手也必须快准狠的面对市场了。

总结产品和项目不同的特征如下:

1、项目具有固定周期,项目结项完毕,开发工作也基本结束了,后期修修补补。产品当然也有周期,但是不是客户定的周期,而是企业战略和市场决定。

2、项目基本瀑布式开发,而产品如果竞争激烈,那就必须敏捷迭代,对需求池进行排序,快速跟进。

3、产品和项目都具有可复制特性。但是项目的复制由于客户需求的不同,需求范围有很大的不同,也就是所说的定制化程度高,基本上是方案和设计思想的复制,其他都是大量定制开发。而产品一旦确定用户群和需求痛点这些大方向,基本上是一个线性开发的过程。不断开发迎合市场和企业战略的新需求,废弃没必要和过时的老需求。

云端产品和终端产品的区别:

如果云端产品,那个所有用户都会感知一个版本。而如果是终端产品的话,不同的终端用户群会有不同的产品版本,根据公司策略和客户要求去升级。

那么对于产品化的分支策略,开发需不停的在完成需求池中需求的开发。市场则需根据市场策略上线不同的版本,比如有的功能是技术公关,作为公司与竞争对手的pk点,就不能过于超前上线,以便被抄袭。有的是用户最关心就必须在竞争对手之前上线。

这个时候以前的分支策略问题就来了。必须有一个分支是时刻能上线的代码,而且能记录不同的版本(有的版本上线后有bug,需要修改,但是用户也不需要新功能)。

引入TAG

通过在mater上记录tag来记录每次上市的产品版本,如果这个版本有bug,但是用户当前不需要新的需求,就直接在这个tag上创建临时的分支给用户改bug,改完之后代码将代码合并到master。这个时候我们一般不删除这个临时分支,因为鬼知道后面还有啥bug呢,有点类似于release分支,但是和release不同的是,这个只用来改bug,新的功能开发都必须在mater上。开发流程就变成了这样:

产品化分支策略

这里面的问题就是QA测试的时候master不能合并新的代码只能改bug。一旦合并新的功能,上线范围就变了,就得重新测试。必须测试完打上tag之后才行。但是有时候公司内部须对全功能进行内部演示和访谈调研,就必须有一个全版本的分钟,而mater作为发布版本,又能随便合并。怎么办呢,就是引入dev分支。

引入DEV分支

具体做法就是创建dev分支,版本上线是,合并到mater,QA从mater上pull代码做测试用于测试上线,有bug建分支改,改完bug,master和dev上都合并。但是这个时候dev上开发的新模块不合并到mater,大家提交还是往dev上提交,内部演示都从dev打包做演示。下次上线依然是提交到mater让QA测试(这一块和网上很多人说的不一样,大家都是从dev上做测试,然后没问题合并到mater)。这样下来分支就变成这样:

dev分支

有些地方会和网上的会有差别,比如我们是在最后才引入dev分支的。

总结

1、针对项目和产品我们采用了两套策略,项目用release策略,产品用tag策略。

2、另外如果是集中式开发的小团队小项目,只基于mater开发也不是不可,也挺灵活,加上严格的代码审核和自检培训就行了。

3、这里面基本也用到GIT的三种工作流的思想(Git Flow,GitHub Flow,GitLab Flow),加入了自己的一些实践和定制。

关于pull request

对于git中的pull request协作机制,实际应用中也基本没用上,感觉比较适合外包或者开源协作项目(多个不太熟悉的小团队合作开发一个项目)。如果是内部团队,毕竟这种协同机制内部定死也没必要线上处理了。

我们的代码审核时间有时候不在上线前,基本上会周五或者周一由专人进行(一方面审核代码及完善审核规则,一方面培训新人),而并不是提交一个模块就让人审核,这样如果功能点太多,审核人的时间就很零碎。但是上线的功能肯定是审核过了的,而且会有严格的代码测试。


零零碎碎也了很多,欢迎大家一起讨论吧,有问题也欢迎留言提出。

总之,适合自己团队和公司的就是最好的,用发展的眼光看待技术。

【干货分享】大话团队的GIT分支策略进化史的更多相关文章

  1. git 分支策略

    转 http://www.ruanyifeng.com/blog/2012/07/git.html  作者: 阮一峰 如果你严肃对待编程,就必定会使用"版本管理系统"(Versio ...

  2. 「干货分享」模块化编程和maven配置实践一则

    ​ 封面 说到模块化编程,对我个人而言首先起因于团队协作的需要,也就是组织架构结构特点来决定,而不是跟风求得自我认同,看看我们团队的组织结构: ​ 其中: 基础平台部职责: 1.AI实验室:语音,图像 ...

  3. 团队项目的Git分支管理规范

    原文地址: http://blog.jboost.cn/2019/06/17/git-branch.html 许多公司的开发团队都采用Git来做代码版本控制.如何有效地协同开发人员之间,以及开发.测试 ...

  4. iOS开发那些事儿(六)Git分之策略

    git 分支策略 将要介绍的这个模型不会比任何一套流程内容多,每个团队成员都必须遵守,这样便于管理软件开发过程. 既分散又集中 我们使用的,且与这个分支模型配合的非常好的库,他有一个“真正”的中央仓库 ...

  5. 近期关于CI/CD策略以及git分支模型的思考

    近两个月由于个人处于新环境.新项目的适应阶段,没怎么提笔写些文章.中间有好几个想法想记录下来分享,但受限于没有很好的时间段供自己总结思考(也可以总结为间歇性懒癌和剧癌发作),便啥也没有更新.借这个周末 ...

  6. Git 分支管理策略汇总

    原文链接: Git 分支管理策略 最近,团队新入职了一些小伙伴,在开发过程中,他们问我 Git 分支是如何管理的,以及应该怎么提交代码? 我大概说了一些规则,但仔细想来,好像也并没有形成一个清晰规范的 ...

  7. Git 分支管理策略

    分支管理策略 下面我们来说一下一般企业中开发一个项目的分支策略: 主分支 master 开发分支 develop 功能分支 feature 预发布分支  release bug 分支 fixbug 其 ...

  8. git分支管理之分支管理策略

    分支管理策略 阅读: 246888 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就 ...

  9. GIT 分支管理:分支管理策略、Bug分支、Feature分支

    通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...

随机推荐

  1. 1080 Graduate Admission (30)(30 分)

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  2. 【转】有的共享软件赚了一百万美元,而为什么你没有?&&我的软件推广成功之路

    有的共享软件赚了一百万美元,而为什么你没有? 转自:http://blog.csdn.net/wangjiwei2010/article/details/1267044 译:DreamGoal 原作: ...

  3. Jasper:目录/资源

    ylbtech-Jasper:目录/资源 1. 官网返回顶部 1. https://www.jasper.com/ 2. 2.返回顶部 1. http://api.jasperwireless.com ...

  4. node.js setup wizard ended prematurely Win7安装nodejs失败解决方法

    笔记本win7在nodejs官方网站下载.msi文件安装,安装到一半的时候,进度条提示:roll back,because of a error.node.JS setup wizard ended ...

  5. python2 + selenium + eclipse 中,通过django生产数据库表的时候报错

    python2 + selenium + eclipse 中,通过django生产数据库表的时候报错 解决: 1.查看自己电脑中,“开始-->控制面板-->管理工具-->服务--&g ...

  6. Runtime.getRuntime()

    1转自:https://www.aliyun.com/jiaocheng/849282.html 那就首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的.我说 ...

  7. python 进行web测试

    1:安装nosetests Python 单元测试框架之Nose http://blog.sina.com.cn/s/blog_65a8ab5d0101fihb.html Python nose te ...

  8. Crypto Challenge Set 1解题报告

    1.Convert hex to base64 题意:给出一个hex编码过的字符串,将它进行base64加密 解题关键:直接利用base64库函数实现 import base64 str1=" ...

  9. Web 字体的选择和运用

    首先来看一则设计师和前端小白的日常,这是使用 Mac OS 的设计师给的效果图 这是使用 Windows 开发的实际产品页面 我跟你们说,设定字体要按照基本法! (PS: 以上截图不代表网站真实面貌, ...

  10. IIS7启用GZip压缩

    本文转载自 http://www.cnblogs.com/kissdodog/p/6252129.html GZip压缩通常会达到70%以上的压缩率,如果是手机Web这无疑会使网站的访问速度大大增加, ...