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项目有几个特点:
- 安全性要求极高:代码出问题可能涉及人身安全
- 多版本并行:可能同时维护多个车型的版本
- 硬件依赖强:代码和硬件平台强耦合
- 测试周期长:一个完整的测试验证可能需要几周
基于这些特点,我建议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 分支策略的实施要点
光有分支结构还不够,还得有配套的规则。我总结了几条:
- Code Review是必须的:任何合并到develop或master的代码,都必须经过至少两个人的Review
- CI流水线必须通过:合并前,CI流水线必须全部通过。包括编译、单元测试、静态代码分析
- 禁止直接推送到master:master只能通过Pull Request合并,而且必须由Release Manager操作
- 分支命名要规范:feature/功能名称、hotfix/问题编号、release/版本号
- 及时清理过期分支:功能开发完或者发布完成后,及时删除对应的分支
避坑指南:我曾经在一个项目里,因为没及时清理分支,最后积累了200多个分支。找代码找得想哭。从那以后,我要求团队每周清理一次过期分支。
4.4 总结
分支策略没有银弹。Git Flow适合传统发布周期,GitHub Flow适合持续部署,GitLab Flow是折中方案。
对于ADAS项目,我建议采用改良版的GitLab Flow,加上硬件分支。核心原则是:保证代码质量,支持多版本并行,适应硬件差异。
最后说一句:分支策略是工具,不是目的。别为了用分支而用分支,要为了解决问题而用分支。你想想看,如果你们的团队只有三个人,搞个Git Flow那不是自找麻烦吗?
我的建议:从小做起,逐步完善。先定一个简单的规则,运行一段时间后再根据实际情况调整。别想着一口吃成胖子。