1. 问题背景:为什么我们放弃了“标准”GitFlow

2024年3月,我们的SaaS产品进入密集迭代期,每周要发布2次。当时用着标准的GitFlow:develop长期分支,feature分支从develop切出,合并回develop,每两周从developrelease分支。

第一个问题:合并地狱。5个开发者在develop上并发,每次merge都会产生大量冲突。我们的代码库是单体Java服务,平均每次merge要花40分钟解决冲突。

第二个问题:发布周期失控。因为develop不稳定,我们不得不提前3天冻结代码,导致紧急bugfix无法及时进发布。2024年3月某次线上事故,fix分支从创建到上线用了22小时,被业务方投诉。

我们查了DORA报告,高效能团队部署频率是每天多次,变更前置时间小于1小时。而我们两周一次发布,前置时间2.3天——属于低效能团队。问题不在工具,而在分支模型与发布节奏的错配

2. 环境与版本:我们用的具体工具链

  • 代码托管:GitLab Enterprise 16.7(支持MR、Code Owners、Push Rules)
  • CI/CD:GitHub Actions(因为团队已有GitHub私有仓库,通过GitLab Mirror同步)
  • 本地Git版本:2.43.0(支持git worktree的稳定版本)
  • 语言环境:Java 17 + Maven 3.9,单体应用,模块化程度中等

关键版本注意点:Git 2.40以上才支持git branch --rebase的默认策略调整,否则pull --rebase行为不一致。

3. 方案设计:动态TrunkBased分支模型

我们最终落地的策略是“动态TrunkBased”,核心规则:

  • main:唯一长期分支,始终可发布。受保护,禁止直接push,只能通过MR合并。
  • feat/*:从main切出,生命周期不超过3天。合并前必须rebase到最新main
  • fix/*:紧急修复,不经过feat,直接切出,合并后立即发布。
  • 不允许developreleasehotfix长分支。所有临时分支合并后立即删除。

核心逻辑是:任何改动必须在24小时内回到main,保持主干干净且可部署。我们通过MR模板强制约束。

4. 核心实现:分支保护、MR流水线、CI配置

4.1 分支保护规则(GitLab设置)

在GitLab的Settings → Repository → Protected Branches中配置:

Branch: main
Allowed to merge: Maintainers(禁止开发者直接合并)
Allowed to push: No one(必须通过MR)
Code owner approval: 至少1人
Pipeline must succeed: 开启

4.2 本地git配置与pre-commit钩子

每个开发者必须执行以下全局配置:

```bash

全局启用rebase策略,避免merge commit污染历史

git config --global pull.rebase true
git config --global branch.autosetuprebase always

创建worktree,支持并行开发多个feat

git worktree add ../feature-A -b feat/支付模块重构 main

安装pre-commit钩子(.git/hooks/pre-commit)

cat > .git/hooks/pre-commit Asia/Shanghai,并统一Docker容器的TZ`环境变量。

6. 效果数据:我们测了什么,提升了多少

从2024年4月切换到新策略,我们跑了8周,对比Q1的数据:

指标 Q1(GitFlow) Q2(TrunkBased) 提升比例
平均发布周期 2.3天 0.8天 65%
部署频率 每周2次 每天1.5次 275%
MR冲突率(需人工解决) 41% 13.5% 67%下降
平均MR review时间 4.6小时 1.2小时 74%
线上回滚次数 3次/月 1次/月 66%下降

最直观的变化:原来自测+review+发布要走2天流程,现在因为main始终可部署,一个简单的bugfix(2个文件改动)从push到生产环境只需要40分钟(含15分钟CI,10分钟人工approve,15分钟滚动发布)。

7. 总结:价值与适用边界

这套动态TrunkBased策略不是银弹。适合:5-15人小团队、CI成熟、自动化测试覆盖率高(>40%)、产品迭代快。不适合:30人以上多团队并行、需要严格版本隔离的合规场景(如金融核心系统)。

关键收获:
1. 分支数量与发布频率成反比——分支越多,集成成本越高。
2. CI必须成为硬门禁——rebase check和test失败直接阻断merge,比人工review高效10倍。
3. 本地工具链决定协作效率——worktreepre-commit钩子,投入产出比极高。

最后给一个建议:不要盲目崇拜任何工作流。GitFlow有它的适用场景,但我们用数据说话——如果你的团队部署频率低于每周一次,先解决CI和自动化测试,再谈分支策略。我们花了3周迁移,但收益是长期且显著的。