4、分支策略模型:Git Flow、GitHub Flow、GitLab Flow、ADAS项目中的分支策略选择

说到分支策略,我见过太多团队在这上面栽跟头了。

有的团队一开始就搞了个超级复杂的分支模型,结果开发效率比用SVN还慢。有的团队又太随意,主干上直接改,一上线就出事故。

分支策略说白了,就是你们团队怎么协作写代码的规则。没有规矩,不成方圆。尤其是在ADAS这种高安全要求的领域,分支策略选错了,后果很严重。

4.1 三大主流分支模型概览

目前业界主流的就三种:Git Flow、GitHub Flow、GitLab Flow。我一个个说。

4.1.1 Git Flow

这是最经典的分支模型,2010年就出来了。它定义了五种分支:

  • master:主分支,只放发布过的代码
  • develop:开发分支,日常开发的主线
  • feature:功能分支,从develop拉出来,开发完合并回去
  • release:发布分支,从develop拉出来,做发布前的准备工作
  • hotfix:热修复分支,从master拉出来,修完合并回master和develop

听起来很完整对吧?但说实话,我在实际项目中很少用完整的Git Flow。

我的经验:Git Flow适合有固定发布周期的项目,比如一个月发一次版。但ADAS项目往往需要更灵活的节奏。

4.1.2 GitHub Flow

GitHub Flow就简单多了。它只有两个核心概念:

  • master:任何时候都是可部署的状态
  • feature分支:从master拉出来,通过Pull Request合并回去

没有develop分支,没有release分支。简单粗暴。

我刚开始觉得这太简陋了,后来发现对于持续部署的项目,这反而是最合适的。你想想看,如果你的CI/CD流水线够快,每次合并到master都能自动部署,那要那么多分支干嘛?

注意:GitHub Flow要求团队有很强的纪律性。每个人都要保证自己的代码不会搞坏master。我曾经在一个团队里推行GitHub Flow,结果有人直接把未测试的代码合并到master,导致整个CI流水线挂了半天。

4.1.3 GitLab Flow

GitLab Flow算是前两者的折中方案。它引入了环境分支的概念:

  • master:主分支
  • pre-production:预发布环境分支
  • production:生产环境分支

代码从master合并到pre-production,测试通过后再合并到production。这样既保持了简单性,又有了环境隔离。

我个人比较喜欢GitLab Flow。它不像Git Flow那么重,又比GitHub Flow多了环境管理的能力。

4.2 ADAS项目中的分支策略选择

好了,理论说完了。咱们来聊聊ADAS项目到底该选哪种。

ADAS项目有几个特点:

  1. 安全性要求极高:代码出问题可能涉及人身安全
  2. 多版本并行:可能同时维护多个车型的版本
  3. 硬件依赖强:代码和硬件平台强耦合
  4. 测试周期长:一个完整的测试验证可能需要几周

基于这些特点,我建议ADAS项目采用改良版的GitLab Flow

我的建议:不要照搬任何一种模型。要根据自己团队的实际情况做调整。我见过最成功的ADAS团队,他们的分支模型是自己定制的。

4.2.1 我推荐的分支结构

这是我经过多个ADAS项目验证过的分支结构:

分支名称 用途 谁可以合并
master 生产环境代码,只放经过完整验证的版本 Release Manager
develop 日常开发主线,代码经过单元测试和集成测试 所有开发者(需Code Review)
feature/* 功能开发分支,从develop拉出 功能开发者
release/* 发布候选分支,从develop拉出 Release Manager
hotfix/* 紧急修复分支,从master拉出 指定的修复人员
hardware/* 硬件适配分支,用于特定硬件平台的适配 硬件工程师

嗯,这里要注意,我加了一个hardware/*分支。这是ADAS项目特有的。因为不同车型的硬件配置可能不同,需要单独做适配。

4.2.2 实际案例

我记得有一次,我们同时在做三个车型的ADAS系统:A车型用英伟达Orin,B车型用高通Snapdragon,C车型用华为MDC。

如果只用一套代码,根本没法管理。后来我们用了硬件分支:

# 从develop拉出硬件适配分支
git checkout -b hardware/nvidia-orin develop
git checkout -b hardware/qualcomm-sa8295 develop
git checkout -b hardware/huawei-mdc610 develop

# 在硬件分支上做适配开发
# 适配完成后合并回develop
git checkout develop
git merge --no-ff hardware/nvidia-orin

这样每个硬件平台的适配工作互不干扰,最后统一合并到develop进行集成测试。

关键点:硬件分支的生命周期和硬件平台的生命周期一致。硬件平台退役了,分支就可以删除了。

4.3 分支策略的实施要点

光有分支结构还不够,还得有配套的规则。我总结了几条:

  1. Code Review是必须的:任何合并到develop或master的代码,都必须经过至少两个人的Review
  2. CI流水线必须通过:合并前,CI流水线必须全部通过。包括编译、单元测试、静态代码分析
  3. 禁止直接推送到master:master只能通过Pull Request合并,而且必须由Release Manager操作
  4. 分支命名要规范:feature/功能名称、hotfix/问题编号、release/版本号
  5. 及时清理过期分支:功能开发完或者发布完成后,及时删除对应的分支

避坑指南:我曾经在一个项目里,因为没及时清理分支,最后积累了200多个分支。找代码找得想哭。从那以后,我要求团队每周清理一次过期分支。

4.4 总结

分支策略没有银弹。Git Flow适合传统发布周期,GitHub Flow适合持续部署,GitLab Flow是折中方案。

对于ADAS项目,我建议采用改良版的GitLab Flow,加上硬件分支。核心原则是:保证代码质量,支持多版本并行,适应硬件差异

最后说一句:分支策略是工具,不是目的。别为了用分支而用分支,要为了解决问题而用分支。你想想看,如果你们的团队只有三个人,搞个Git Flow那不是自找麻烦吗?

我的建议:从小做起,逐步完善。先定一个简单的规则,运行一段时间后再根据实际情况调整。别想着一口吃成胖子。