基于 Git 的开发工作流——主干开发特性总结

news/2024/9/23 4:32:05/

51483b71b778287cd9427f89d15387f9.gif

在参与开发的过程,得益与平台提供便捷的开发流程,简化很多开发过程操作分支的步骤;也就很好奇,为什么研发平台怎么设计,考虑的点是为什么,便有了这次对主干研发的学习与记录。

当我们是构建软件项目的唯一开发人员时,可以根据个人喜好创建和修改代码。当我们为团队运行的项目贡献代码时,我们需要遵循一套标准化的指导方针并与其他团队成员精确协调。标准指南和协调的工作努力对于每个基于团队的软件开发项目的成功至关重要。

为了满足这一需求,世界各地的工程团队设计了许多开发工作流程。大多数团队使用 Git 进行版本控制和管理他们的软件代码。基于 Git 的两种最流行的开发工作流是基于主干的开发和基于特性的开发。Facebook、谷歌、Netflix 和许多其他科技企业的团队使用这些工作流程。

3958568a9a598ca798020fee80477566.png

基于特性的开发

  Git Flow

Git Flow 是为了解决多个不同特性之间并行开发需要的一种工作方式。当开始一个特性的开发工作的时候,从主干上拉出一个特性分支,所有的关于该特性的开发工作都发生在这个特性分支上,当完成该特性的工作之后,再把特性分支合并回代码主路径上,并准备发布。

master分支:主开发分支

develop分支:主开发分支

feature分支:功能分支,从develop切出分支,用于功能开发,开发完成后合并到主开发分支

release分支:发布分支,从develop切出分支测试或发布,发布完成后,把release合并到master和develop分支

hotfixex分支:从master切出,修复线上问题,修复后分支合并到master和develop分支

19211e9a8ea5dc7d94bad595c36165d1.png

优点:每个分支描述清晰,对于不同问题不同场景,能够很好覆盖开发、发布、bugfix的流程

缺点:分支类型多,增加开发人员理解成本、操作成本(不同分支间合并冲突)

  GitHub Flow

相对Git Flow而言,GitHub Flow只有特性(feature)和主分支(master),当featrue合并到master之后,即部署生产。

bc73cd8bd681a8dc7e5486613cd6074f.png

优点:分支类型简单,能够频繁部署生产

缺点:没有release分支,没有很好回滚机制保障线上问题快速恢复;对于主干的可发布性保障极高

可能对于一些开源项目/个人项目,不要求过高的稳定性,也不需要预发/生产环境的场景,这种极致的简单,可能开发人员效率会更高一点。

  GitLab Flow

在GitHub Flow的基础上,有两个变化:使用环境分支和版本分支,引入了 Pre-production 和 Production 两种发布分支,featrue分支合并到主干不会立即发布,而是主干合并到对应的发布分支上触发对应环境发布:

基于日常/生产 环境的工作流程:这种多环境能够让 hotfix 或者 feature 分支能够在发布到生产环境之前被测试,而不像github flow那样简单粗暴。

85d4e57ff932d3fbcbcd19652c4a46db.png

基于版本分支的工作流程:当需要向外界发布软件时,使用发布分支;尽可能晚的发布一个大版本,这样可以最大限度地减少必须将错误修复应用到多个分支的时间长度;另外,发布分支后,修复错误尽量将错误合并到main分支,避免后续版本发布错误依然存在。

5cdd5e0ccafb21ada92c84af436bec6a.png

优点:对github flow进行补充,能够对不同项目有合理的分支发布选择

缺点:过于灵活,对于不同项目发布流程相差较大,研发平台很难统一维护

4e7434dda9d8a9f932f056ebdcc30a35.png

主干研发

主干研发:

团队开发人员之间通过约定向被指定为“主干”的分支提交代码,在变更开发完成后(开发、测试、CR)合并到主干,主干研发要求团队高频率的提交代码,通过持续测试保证主干的可发布性,避免长期存在的多分支导致的开发压力;

79c4f6707cde7fae933bee752e930e32.png

一般情况下,发布也是在主干分支进行,当需要隔离不兼容代码的时候,会从主干拉取固定的发布分支。图中红色圆点表示一次坏提交,在构建被破坏后立即被后面的提交修复了。

7667448fe86c7e1731c74848b0a58149.png

优点:

  1. 降低解决冲突的成本:开发人员在自己的分支上独自工作的时间越长,越难将变更并入主干。另外,当分支个数和每个分支上变更数同时增加时,合并难度会很大。

  2. 高质量的代码:日常工作中,不知道大家是否有一个习惯,合并代码通常会在项目的提测或上线前一段时间,日常的合并次数减少,转化到发布前处理大量的合并,以及大量的CR,该流程下,高频次的代码提交合并,将大块的代码切分到日常小块代码和CR,且合并需要通过相关卡口(构建、包依赖等),避免发布前才关注到CR和测试的问题

  3. 高效的持续交付:对于大规模的项目,主干分支保持鲜活(其他人的变动能够被及时感知),团队开发效率更好;不用等即可上线,基于特性分支迭代开发的模式,当多个变更集成到迭代时,一个变更完成,另外一个变更没有完成需要退出迭代;测试环境更加稳定,主干研发发布分支在固定分支上,当特性分支迭代有多变更情况,此时,创建的是一个临时发布分支,当有变更加入或退出时,会导致发布的环境不稳定。

缺点:

  1. 对团队的基础架构和协作能力的要求很高,要求每次commit的代码能够独立运行,如果合入主干的commit出现问题,会阻塞团队的进度。

  2. 对团队代码质量要求高,评审机制要求完善。需要有完善的 CR 机制,将问题代码尽可能在发布的前置环节发现并解决。

eda57fc48095eb2f243e1db6d09738d0.png

前端中可能适合的主干开发的场景

工具函数的开发:

  1. 开发阶段:工具函数的需求功能点容易切分,比如 env、cookie 这些工具类函数,可以作为切分为小的代码块,在上线之前通过自动化测试/自测,保证ci通过后,即可快速上线,新增功能;其他人提交功能后,能够及时感知到master的改动点。

  2. 发布阶段:主干开发天然基于版本发布,可以支持不同功能的版本

  3. bugfix:基于工具函数的bug,需要快速修复,通过CI后,合并到主干,发布修复的版本,不再拉取新的bugfix分支,解决可能存在的冲突问题。

基于特性开发流程:

4786a8f5da1c3e3d5fcd63779d69326f.png

基于主干开发流程:

d70fe97a693b5cbf8be622f1e3a81c50.png

ce3d6fa1771edf0e39f1b290388936af.png

总结

基于主干开发相对于分支开发的各种利弊,根据自己所在团队的实际场景来看待,选择用主干开发还是分支开发。如果主干开发的优势对自身产品可有可无,那么没有这种必要来切换。但是如果有必要,但是团队的成熟度和技能达不到,也不适合切换到主干开发。当选择要切换到主干开发,一定要有心里准备来应对变革过程中遇到的各种问题。当然当你的团队经历了这些阵痛并真正适应了主干开发,那么团队就的成长也是巨大的。

42b2f7a60f7ddd3dc388d2907e0535c2.png

团队介绍

我们是大淘宝技术行业与商家技术团队,是消费电子线下业务,主要面向线下门店的分销、经营、零售相关的产品。技术侧属于大淘宝技术前端团队,技术产品服务阿里巴巴整个集团亿万级别的业务。

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法


http://www.ppmy.cn/news/43033.html

相关文章

Qt Quick - 弹出控件综述

Qt Quick - 弹出控件综述一、概述一、抽屉控件二、菜单控件三、弹出控件四、工具提示控件一、概述 控件功能Dialog带有标准按钮和标题的弹出式对话框,用于与用户进行短期交互Drawer可以用滑动手势打开和关闭的侧面板Menu弹出式菜单,可以用作上下文菜单或…

Sharding-JDBC之水平分表

目录一、简介1.1、垂直分表1.2、水平分表二、maven依赖三、数据库3.1、创建数据库3.2、创建表四、配置(二选一)4.1、properties配置4.2、yml配置五、实现5.1、实体5.2、持久层5.3、服务层5.4、测试类5.4.1、保存数据5.4.2、查询数据一、简介 1.1、垂直分…

nginx反向代理_负载均衡的配置

说明 两台虚拟机: 88节点是自己的虚拟机 66节点是小组成员的虚拟机,我们暂且叫同学机 tomcat端口,分别为8081和8082 总结就是: 自己虚拟机上面安装nginx和tomcat8082 同学机上安装tomcat8081 一、开始安装nginx(只安装…

在Spring Boot微服务使用Jedis操作Redis String字符串

记录:407 场景:在Spring Boot微服务使用Jedis操作Redis String字符串。 版本:JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。 1.微服务中配置Redis信息 1.1在application.yml中Jedis配置信息 hub:example:redis:jedis:host: 192.…

Matlab论文插图绘制模板第85期—模值赋色的箭头图

在之前的文章中,分享了Matlab箭头图的绘制模板: 进一步,如果我们想对每一个箭头赋上颜色,以更加直观地表示其模值的大小,该怎么操作呢? 那么,来看一下模值赋色的箭头图的绘制模板。 先来看一下…

EightCap易汇:外汇投资入门需要了解哪些必要知识?

外汇市场是国际投资市场,日内交易量巨大,盈利机会极多。外汇是一种含有杠杆的投资产品,杠杆带来了高收益,也会带来高风险,对于外汇新手来说存在一定难度。新手投资者要如何交易,才能抓住外汇市场的盈利机会…

山东双软认证需要什么条件

山东双软认证需要什么条件 ​ 一、软件企业认定服务 1.软件企业认定基本条件 ①在我国境内成立,有固定办公场所,以软件开发销售为主营业务的企业; ②大专学历人数≧当年月平均人数的40%,研发人员≧当年月平均人数20%&#xff1b…

由libunifex来看Executor的任务构建

前言 之前的一篇文章讲述了future的优缺点,以及future的组合性,其中也讲述了构建任务DAG一些问题,同时给出了比较好的方案则是Executor。 Executor还未进入标准(C23),Executor拥有惰性构建及良好的抽象模型…