2. 版本控制与分支策略:Git Flow、GitHub Flow、Trunk-Based Development

版本控制这件事,说白了就是团队协作的「交通规则」。没有规则,大家各开各的车,早晚撞成一团。我见过太多团队,一开始觉得分支策略无所谓,结果上线前合并冲突能搞到凌晨三点。嗯,今天我们就来聊聊三种主流的分支策略,以及怎么选。

2.1 为什么分支策略这么重要?

你想想看,一个团队十几个人,同时开发多个功能。有人修bug,有人做新功能,有人改配置。如果没有统一的分支策略,代码库很快就会变成一团乱麻。

分支策略的核心目标其实就三个:

  • 并行开发:多人同时工作,互不干扰
  • 代码隔离:未完成的功能不会影响主分支
  • 可控发布:知道什么时候该合并,什么时候该发布

我在项目中遇到过最惨的一次,就是因为没有分支策略,两个团队同时改了同一个配置文件,结果上线后数据库连接全断了。从那以后,我对分支策略就特别较真。

2.2 Git Flow:经典但有点重

Git Flow 是 2010 年 Vincent Driessen 提出的。它定义了五种分支:

分支类型 命名规则 用途
master master 生产环境代码,只接受合并
develop develop 日常开发的主分支
feature feature/xxx 新功能开发
release release/x.x.x 发布前的准备分支
hotfix hotfix/x.x.x 紧急修复生产问题

Git Flow 的流程大概是这样的:

# 从 develop 创建 feature 分支
git checkout -b feature/user-login develop

# 开发完成后合并回 develop
git checkout develop
git merge --no-ff feature/user-login

# 准备发布时,从 develop 创建 release 分支
git checkout -b release/1.2.0 develop

# 修复 release 分支上的问题后,合并到 master 和 develop
git checkout master
git merge --no-ff release/1.2.0
git tag -a 1.2.0

git checkout develop
git merge --no-ff release/1.2.0

Git Flow 的优点:结构清晰,适合有固定发布周期的项目。

Git Flow 的缺点:分支太多,操作复杂。对于持续交付来说,太重了。

注意:我曾经在一个传统企业项目里用 Git Flow,结果团队光是在「这个 bug 该用 hotfix 还是直接改 develop」上就吵了三天。如果你的团队不大,或者发布频率很高,Git Flow 可能不是最佳选择。

2.3 GitHub Flow:轻量级的选择

GitHub Flow 是 GitHub 团队在实践中总结出来的。它比 Git Flow 简单得多:

  • 只有一个长期分支:main(或 master)
  • 所有开发都在 feature 分支上进行
  • 通过 Pull Request 进行代码审查
  • 合并后立即部署

流程是这样的:

# 从 main 创建 feature 分支
git checkout -b feature/add-payment main

# 开发、提交、推送
git add .
git commit -m "feat: add payment module"
git push origin feature/add-payment

# 在 GitHub 上创建 Pull Request
# 代码审查通过后,合并到 main
# 合并后自动部署

我的建议:如果你的团队做的是 SaaS 产品,或者发布频率很高(每天多次),GitHub Flow 是最省心的选择。我现在的团队就用这个,配合 CI/CD,从合并到上线也就几分钟。

2.4 Trunk-Based Development:极简主义

Trunk-Based Development(主干开发)是更激进的做法。所有开发者都在 main 分支上工作,通过短生命周期的 feature 分支或直接提交来协作。

核心原则:

  • 分支生命周期不超过几小时
  • 频繁合并,避免大冲突
  • 配合 feature toggle(特性开关)控制未完成的功能
# 直接从 main 拉取最新代码
git pull origin main

# 做小改动,频繁提交
git add .
git commit -m "fix: correct typo in login form"
git push origin main

# 或者用短分支
git checkout -b fix-login-typo
# 修改代码
git commit -m "fix: correct typo in login form"
git push origin fix-login-typo
# 立即创建 PR,审查后合并

关键点:Trunk-Based Development 要求团队有很强的纪律性。代码必须小步提交,不能有「做了一半」的代码留在主分支上。未完成的功能用 feature toggle 隐藏起来。

为什么会有人选择这种看似「激进」的方式?因为它的好处太明显了:

  • 合并冲突极少发生
  • 持续集成真正落地
  • 发布变得非常频繁和可靠

避坑指南:我曾经在一个金融项目里尝试 Trunk-Based Development,结果失败了。原因是团队里有人习惯一次提交几百行代码,导致主分支经常「坏掉」。如果你团队里有人做不到小步提交,先别急着上主干开发。

2.5 怎么选?我的经验总结

说实话,没有「最好」的分支策略,只有「最合适」的。我根据项目类型给个参考:

项目类型 推荐策略 原因
传统企业应用(月/季度发布) Git Flow 需要明确的发布流程和版本管理
SaaS / Web 应用(每日多次发布) GitHub Flow 轻量、快速、适合持续部署
成熟团队 / 微服务架构 Trunk-Based Development 极致效率,配合 feature toggle 使用
开源项目 GitHub Flow 或 Git Flow 看社区习惯,GitHub Flow 更常见

我的建议:如果你刚开始做持续集成,从 GitHub Flow 开始是最稳妥的。它简单、容易理解,而且能让你快速体验到 CI/CD 的好处。等团队成熟了,再考虑要不要转向 Trunk-Based Development。

最后说一句:分支策略是工具,不是目的。别为了用 Git Flow 而用 Git Flow,也别觉得 Trunk-Based Development 就高人一等。关键是找到适合你团队的节奏。嗯,今天就聊到这里,下一章我们讲讲 CI 流水线的具体搭建。