4、分支策略:Git Flow、GitHub Flow、Trunk Based Development在嵌入式项目中的选择。
聊到分支策略,很多嵌入式工程师第一反应是:“不就是建个分支、合个代码吗?搞那么复杂干嘛?”
嗯,我以前也这么想。直到有一次,我在一个智能窗帘项目里,因为分支策略没选好,导致固件版本乱成一锅粥。生产线的工人拿着三四种不同版本的固件在烧录,售后那边又反馈说某个功能时好时坏……那场面,真叫一个头大。
所以今天咱们就好好掰扯掰扯,Git Flow、GitHub Flow、Trunk Based Development(主干开发)这三种主流分支策略,在嵌入式项目里到底该怎么选。
先说说这三种策略是啥
说白了,这三种策略代表了三种不同的开发节奏和协作方式。我简单给你概括一下:
- Git Flow:分支多,规矩多。有master、develop、feature、release、hotfix等分支。适合版本周期长、需要严格管控的项目。
- GitHub Flow:轻量级。只有一个主干(main),所有开发都在feature分支上做,然后提Pull Request合并。适合持续部署、快速迭代的团队。
- Trunk Based Development:更激进。所有开发者直接在主干上提交,或者只开短期分支(不超过几天)。强调小步快跑,频繁集成。
你想想看,这三种策略,哪一种更适合咱们嵌入式开发?
嵌入式项目的特殊性
嵌入式项目跟纯软件项目不一样。我遇到过不少团队,直接把互联网那套分支策略搬过来,结果水土不服。
嵌入式项目有几个特点:
- 硬件依赖性强:代码跟硬件绑定,不是随便拉个分支就能跑起来的。
- 版本发布周期长:从开发到测试到量产,往往需要几周甚至几个月。
- 需要维护多个版本:比如老版本还在产线上跑,新版本已经在开发了。
- 固件烧录风险高:一旦合错代码,烧到芯片里,可能就得返工。
所以,选分支策略不能只看流行,得看合不合适。
Git Flow:适合复杂嵌入式项目
我个人习惯在大型嵌入式项目里用Git Flow。为什么?因为它结构清晰,责任明确。
举个例子,我们做窗帘电机的主控固件。开发周期大概三个月,中间要经历:
- 功能开发(电机控制算法、蓝牙通信、传感器采集)
- 硬件联调(不同批次电机、不同型号的霍尔传感器)
- 稳定性测试(长时间运行、异常断电、堵转保护)
- 量产准备(固件锁定、生产测试工具)
用Git Flow,我们可以这样安排:
| 分支 | 用途 | 嵌入式场景举例 |
|---|---|---|
| master | 只存放已发布的稳定版本 | 量产固件v1.0、v1.1 |
| develop | 日常开发集成分支 | 所有新功能合入这里 |
| feature/* | 每个功能独立开发 | feature/ble-ota、feature/motor-calibration |
| release/* | 发布前的测试和修复 | release/v1.2-rc1 |
| hotfix/* | 紧急修复线上问题 | hotfix/crash-on-power-loss |
重点来了:在嵌入式项目里,release分支特别有用。因为硬件联调经常发现新问题,你不能直接在主分支上改,否则会影响其他开发。release分支就是给测试和修复留的缓冲区。
不过Git Flow也有缺点——分支太多,合并起来挺麻烦的。小团队或者快速原型阶段,用起来会觉得有点重。
GitHub Flow:适合快速原型和小团队
如果你在做的是一个小型窗帘电机控制器,团队就两三个人,开发周期一两周。那GitHub Flow就够用了。
它的核心思想很简单:
- 所有开发都在feature分支上做
- 完成后提Pull Request
- 代码审查通过后合并到main
- 合并即部署
我在一个快速验证项目里用过这个策略。当时我们要测试一种新的电机驱动方案,从写代码到出固件,只用了三天。GitHub Flow的轻量特性让我们能快速试错。
小提示:用GitHub Flow时,一定要保证main分支随时是可发布状态。嵌入式项目里,这意味着每次合并前,代码必须在目标硬件上通过基本测试。别光在PC上编译通过就合,那会出事的。
但说实话,如果项目涉及到多个硬件版本(比如不同批次的电机、不同型号的传感器),GitHub Flow就有点吃力了。因为main分支只有一个,你很难同时维护多个固件版本。
Trunk Based Development:适合持续集成成熟度高的团队
Trunk Based Development,说白了就是所有开发者都在主干上提交代码。听起来很吓人,对吧?
我刚开始也觉得这不靠谱。但后来在一些对质量要求极高的项目里(比如汽车电子、工业控制),我发现它其实很有价值。
为什么?因为它强制你频繁集成,频繁测试。任何代码提交,都会触发自动化构建和测试。一旦发现问题,立刻修复。
在窗帘电机项目里,如果你能做到:
- 每次提交都通过编译
- 每次提交都在真实硬件上跑过单元测试
- 每次提交都通过静态代码检查
那Trunk Based Development确实能带来极高的开发效率。
注意:Trunk Based Development对自动化测试的要求非常高。我曾经在一个团队里推行过,结果因为硬件测试环境搭建不完善,导致主干频繁被破坏。后来我们不得不退回到Git Flow。
所以,如果你的团队还没有完善的CI/CD流水线,别轻易尝试Trunk Based Development。
我的选择建议
说了这么多,到底该怎么选?我根据自己的经验,给你一个参考:
| 项目类型 | 推荐策略 | 理由 |
|---|---|---|
| 量产级嵌入式产品(如窗帘电机、智能家居网关) | Git Flow | 版本管控严格,支持多版本维护,适合长周期开发 |
| 快速原型、小团队、短期项目 | GitHub Flow | 轻量灵活,快速迭代,适合验证想法 |
| 高可靠性、持续集成成熟、团队经验丰富 | Trunk Based Development | 强制集成,质量高,适合对稳定性要求极高的场景 |
其实没有绝对的好坏。我见过用Git Flow把项目管得一团糟的,也见过用Trunk Based Development做得风生水起的。关键还是看你的团队和项目特点。
避坑指南
最后,分享几个我踩过的坑:
- 分支策略定了就别轻易改:我曾经在一个项目中途从Git Flow切到GitHub Flow,结果历史记录乱得一塌糊涂,团队成员也无所适从。
- 别把硬件配置放在代码分支里:有些团队喜欢为不同硬件版本建不同分支,这是个大坑。应该用配置文件或宏定义来区分硬件版本,而不是用分支。
- 合并前一定要在真实硬件上测试:纯软件项目可以在CI里跑单元测试,但嵌入式项目不行。至少要在目标硬件上跑一遍基本功能测试,再合并。
- 分支命名要有规范:比如feature/xxx、bugfix/xxx、hotfix/xxx。别用“test1”、“new_branch”这种名字,三个月后你自己都看不懂。
嗯,关于分支策略的选择,今天就聊到这儿。记住,没有银弹,只有最适合你的策略。下一章咱们聊聊版本号管理,这个在嵌入式项目里也经常让人头疼。