Git作为分布式代码管理的“当红炸子鸡”,被越来越多团队使用。当团队多个人员在同一个Git仓库上进行代码开发,没有一套标准化流程,将会引起代码管理的混乱,上线流程的迷茫,影响工作效率。制定一套适合自己团队的Gitflow标准化工作流势在必行!

 
 

写在前面的话

Git,作为分布式代码管理软件中的“当红炸子鸡”,被越来越多的开发人员在使用,也被越来越多的开发人员在赞美,是因为它杰出的“分布式”特性,大大方便了团队人员间互相合作。我们火锅管理系统最近也采用Git作为我们代码的管理软件。看着大家每天在Git仓库上建分支,拉代码,合代码,干得不亦乐乎,甚是感染。但是,分支一多,参与人员对Git的掌握程度不一致,难免会出现分支代码管理混乱,上线流程不清晰,从而影响开发效率。正所谓,有规则圆,有矩则方,没有规矩难成方圆。这就是为啥我们需要把Git工作流进行标准化处理,统一的拉分支规则,统一的上线流程,让整个团队所有人员按照统一的标准来干活,从而提高我们代码管理及其上线的效率。

目前的GIT Flow工作流

对Git工作流进行标准化处理咋们可并不是第一家。目前已经有很多人对Git工作流的标准化进行过处理。大概有以下几种:功能开发工作流,Gitflow工作流,Forking工作流,GitHub工作流等。下面我们主要介绍Gitflow工作流。

Git Flow工作流

Gitflow工作流是目前非常流行的一种比较成熟的工作流。该工作流的具体实例图形如下图所示。

如上图所示,我们可以看到,Gitflow工作流把整个代码分支分成了以下几种:Master分支,Hotfix分支,Release分支,Develop分支,Feature分支。各个分支的作用及其交互为:
        Feature分支:我们每当要迭代一个新功能,就需要来创建一个feature分支。该功能的所有代码都在该feature分支上维护。feature分支代码从Develop分支上拉取;并且,代码也会push回Develop分支;
        Develop分支:是我们的开发分支。所有的开发人员在一个迭代周期中,都是从develop分支去拉取代码,然后功能开发完成,就check in回develop分支。当某个迭代周期完成,我们需要从develop分支上把可以发布上线的功能拉取到Release分支进行上线;
        Release分支:当一个迭代周期完成,我们需要从develop分支拉取可以上线的功能到release分支。一旦release分支拉取功能确定,在上线之前,任何人都不可以再往release分支上提交代码。在release分支上进行提测,上线后,合并到master分支;
        Master分支:对应上线功能的代码版本,它是最稳定的代码分支。
HotFix分支:如果线上系统出现了bug,我们需要从master分支拉取一个新分支,也就是hotfix分支,在该分支上解决bug,并且校验bug,然后从该分支上线;

腾讯很多的团队都在采用Gitflow工作流。我们团队也想直接采用Gitflow工作流严格执行,但是我们团队有我们团队的特点,比如,我们没有一个固定的迭代周期,每个功能是直接分配给某一个人来单独开发,单独估计开发时间,单独上线,并且迭代周期很短;前端和后台的代码不在同一个Git仓库中来管理,是分开管理的。以上原因,导致如果我们严格采用Gitflow工作流,有些分支并不需要,有些冗余。针对以上情况,经过小组讨论,我们把gitflow工作流根据自己组的特定情况,更改为如下流程:具体如下图所示:

由于我们没有整体迭代周期的概率,每个功能都是分配给每个具体的人员,由每个具体的人员来分别估计工作时间,并单独开发,然后单独上线,所以,我们去掉了develop分支和release分支,但是增加了merge request过程来做代码review。具体流程如下:
        1)开发人员接到一个新功能需求开发,从master上拉取一个新功能分支,命名规则为:feature-XXX,其中,XXX为功能模块的名字,尽量通俗易懂;
        2)在本地Git仓库也创建一个feature-XXX分支,对应远程的feature-XXX分支。开发人员就在本地的feature-XXX分支上进行功能的开发;
        3)当功能开发完成,需要进行提测,提测之前,跟master分支进行一次代码合并,然后Push代码到远程的feature-XXX分支,在该分支上进行提测,上测试机,并进行问题的修复;
        4)当测试完成,进行预发布测试,从feature-XXX分支拉代码部署到预发布机,在线上环境进行校验,并进行问题的修复;
        5)预发布测试完成,开始提交merge request,做code review。然后,将代码从feature-XXX合并到master分支。
        6)从master分支将代码部署到灰度机器进行灰度,灰度完成没有问题,直接全量;发现问题,回退代码,到步骤5)重新进行;
        7)如果发现线上系统有bug,需要从master分支直接拉取一个bug fixing分支,在该分支上做bug fixing。bug fixing分支的命名规则:bugfixing-XXX-YYY,其中,XXX为功能名称,YYY为分支创建日期。例如:bugfixing-imageurl-0821。所有问题,都在bug fixing分支上修改,并且提测,预发布。当问题解决,准备上线,同理,提交一个merge request,做code review。然后合并代码回Master。在master分支上灰度,并全量上线;
        8)功能全量上线后,对应的分支即可删除。
        9)尽量不要重复用同一个分支来进行多个不同功能的开发,这样很容易让人引起误解。

写在后面的话

没有放之四海而皆准的真理,也没有完美无瑕的流程,只有适合自己团队的流程,才是合理的好流程。在上面流程中,我们没有固定的迭代周期,故而我们去掉了develop分支和release分支。但是,一旦我们的开发流程发生了改变,工作模式发生了变化,那么我们的Gitflow工作流也会随之进行调整。

制定一套适合自己团队的GITflow标准化工作流的更多相关文章

  1. Yeoman:适合现代Web应用的现代工作流

    Yeoman:适合现代Web应用的现代工作流   Yeoman是Google的团队和外部贡献者团队合作开发的,他的目标是通过Grunt(一个用于开发任务自动化的命令行工具)和Bower(一个HTML. ...

  2. 一套轻量级销售团队管理系统【CRM】

    项目描述 Hi,大家好,又到了源码分享时间啦,今天我们分享的源码一个<轻量级销售团队管理系统>,这套系统是一套轻量级的CRM系统,基于SSM的SpringBoot架构.这套项目用到很多潮流 ...

  3. 大学四年,总结一套适合小白的Java自学路线和方法

    前言篇 大家好,我是bigsai 好久不见,甚是想念,文章同时收录在回车课堂(文底阅读原文可达). 无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班.报班通常太费钱,时间又不 ...

  4. php基础知识(很简单一套适合零基础的朋友学习)

    红色的一般都是重点,还有自己的一些废话 运算符 算术运算符: 基本运算(除数不能为0) 比较运算符: 大小比较(类型比较), 如果两个类型不一样,系统会自动转换成统一类型 赋值运算符: 基本赋值和运算 ...

  5. 一个非常适合IT团队的在线API文档、技术文档工具 (ShowDoc)

    在逸橙呆了不到两年,开发时后端都有开发接口API,来到数库,好多后端开发和前端沟通是还是发doc文档,很不方便,我向cto反应,自己找到这个,老乡田雷(php,隔壁村的)也用过,可能某些原因选择其他的 ...

  6. 前端小微团队的Gitlab实践

    疫情期间我感觉整个人懒散了不少,慢慢有意识要振作起来了,恢复到正常的节奏.最近团队代码库从Gerrit迁移到了Gitlab,为了让前端团队日常开发工作有条不紊,高效运转,开发历史可追溯,我也查阅和学习 ...

  7. Week 2 代码规范

    Question 1: 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. My opinion: 我认为恰恰相反,这个可以提高人们的开发效率. 在团队合作当中,如果 ...

  8. 设计 react 组件

    重新设计 React 组件库 诚身 7 个月前   在 react + redux 已经成为大部分前端项目底层架构的今天, 让我们再次回到软件工程界一个永恒问题的探讨上来, 那就是如何提升一个开发团队 ...

  9. 适合码农工作时玩的游戏:Scrum

    适合码农工作时玩的游戏:Scrum 昨天遇到一个来自微软的面试者,在面试的最后,我简单介绍了一下我们团队使用一周一次的 Scrum 来做项目管理.他回答说:” 我在微软也用 Scrum,不过我们一周两 ...

随机推荐

  1. 邮箱大师WPZ协议包

    WIRELESS Z PACKET: i8-version(WZPUnit.getVersion() & 3 | WZPUnit.MAGIC_MASK = 1 & 3 | -48 = ...

  2. easyNetq demo

    本demo包含一个类库,2个console程序 1.新建类库  MQHelper,控制台程序  consumer和proc ,控制台程序引用MQHelper 2.使用nuget安装easynwtq 和 ...

  3. 软件工程第2次作业——Visual Studio 2017下基于C/C++的VSTS单元测试实践

    Write one minute, test all day long. 环境确定 IDE:Microsoft Visual Studio 2017 Community 语言:C++ 单元测试工具:V ...

  4. 【Selenium + Python】之如何获取最新的报告以及os.path.getmtime与os.path.getctime的区别

    import os def new_file(test_dir): #列举test_dir目录下的所有文件(名),结果以列表形式返回. lists=os.listdir(test_dir) #sort ...

  5. eclipse maven 刷新报错

    问题描述: An internal error occurred during: "Loading descriptor for cmbc_wms.".java.lang.Null ...

  6. 提高Interface Builder高效工作的8个技巧

    本文转载至 http://www.cocoachina.com/ios/20141106/10151.html iOS开发Interface Builder 本文译自:8 Tips for worki ...

  7. python 基础 8.2 编译正则对象

    #/usr/bin/python #coding=utf-8 #@Time   :2017/11/14 9:55 #@Auther :liuzhenchuan #@File   :编译正则对象.py ...

  8. 计算机网络 --万维网www

    万维网是一个分布式的超媒体系统,客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所需要的万维网文档.万维网必须解决的几个问题:1.怎样标志分布在整个因特网上的万维网文档?答:万维网使用统一的 ...

  9. java array

    1 array变量 Type[] array_virable_name; 2 array对象 2.1 new Type[] array_virable_name = new Type[NUM]; 2. ...

  10. java 核心技术卷一 知识点

    第九章 集合 1.Iterator和Iterable接口类,作用. 2.Collection接口类,作用. 3.Map接口类,作用.