1. 什么是 Git Flow?

Git Flow 是由 Vincent Driessen 在 2010 年提出的一种 Git 分支管理模型,它为团队协作提供了一套清晰、可预测的分支策略。虽然最初是为有计划发布周期的项目设计的,但其核心思想已被广泛应用于各类软件开发项目中。

核心理念:通过为不同目的分配不同的分支,让并行开发、版本发布和紧急修复各司其职,互不干扰。

2. 五大核心分支

Git Flow 定义了两种类型的分支:长期分支短期分支

2.1 长期分支(始终存在)

分支 命名 用途 部署状态
main main(master) 生产环境代码,每次合并对应一个新版本 随时可部署
develop develop 开发集成分支,包含最新的开发完成功能 开发环境
  • main 分支上的每次提交都应该是可发布的,通常配合 Tag 标记版本号。
  • develop 分支是功能的集散地,所有开发完成的功能最终都会合并到这里。

2.2 短期分支(用完即删)

分支类型 命名规范 从哪创建 合并到 生命周期
Feature feature/* develop develop 功能开发完成即删
Release release/* develop main + develop 测试、发布完成即删
Hotfix hotfix/* main main + develop BUG修复完成即删

3. 分支工作流详解

3.1 Feature 分支 — 开发新功能

每个新功能都在独立分支上开发,互不影响。

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

# 开发过程中,定期同步 develop 的更新
git fetch origin
git rebase origin/develop

# 功能开发完成,合并回 develop
git checkout develop
git merge --no-ff feature/user-authentication

# 删除 feature 分支
git branch -d feature/user-authentication

要点

  • Feature 分支只存在于开发者本地,不合并到 develop 就不会影响其他人。
  • --no-ff(no fast-forward)保留分支合并记录,方便回溯。
  • 一个 Feature 分支的生命周期应尽量短,建议不超过 2 周。

3.2 Release 分支 — 准备发布

当 develop 上的功能足够一个新版本时,从 develop 创建 Release 分支。

# 从 develop 创建 release 分支
git checkout develop
git checkout -b release/1.2.0

# 在 release 分支上只做:
# 1. Bug 修复
# 2. 版本号更新
# 3. 文档完善
# ❌ 不再接受新功能

# 发布准备完成,合并到 main
git checkout main
git merge --no-ff release/1.2.0

# 打版本标签
git tag -a v1.2.0 -m "Release version 1.2.0"

# 同时合并回 develop,保持 develop 也有这些修复
git checkout develop
git merge --no-ff release/1.2.0

# 删除 release 分支
git branch -d release/1.2.0

要点

  • Release 分支创建后,develop 可以继续接收新功能,两者互不阻塞。
  • Release 分支的代码只允许修 Bug,不允许加新功能(代码冻结)。
  • 必须同时合并到 maindevelop

3.3 Hotfix 分支 — 紧急修复生产问题

线上出了紧急 Bug?Hotfix 分支让你在不影响开发节奏的情况下快速修复。

# 从 main 创建 hotfix 分支
git checkout main
git checkout -b hotfix/critical-login-bug

# 修复 Bug...

# 合并到 main 并打标签
git checkout main
git merge --no-ff hotfix/critical-login-bug
git tag -a v1.2.1 -m "Hotfix: critical login bug"

# 合并回 develop
git checkout develop
git merge --no-ff hotfix/critical-login-bug

# 删除 hotfix 分支
git branch -d hotfix/critical-login-bug

要点

  • Hotfix 是唯一直接从 main 创建的短期分支。
  • 同样需要同时合并到 maindevelop
  • 修复后立即发布,无需等待下一个 Release。

4. 完整工作流示意

main:      ●─────────────────────────────●──────────●─────────●
           │                             │          │         │
           │          release/1.2.0──────┤    hotfix/1.2.1────┤
           │          (v1.2.0)           │    (v1.2.1)        │
           │              │              │                    │
develop:   ●────●────●────●────●────●────●────●────●────●──── ●
                │         │         │
         feature/A  feature/B  feature/C

日常工作节奏

  1. developfeature 分支开发功能
  2. 功能完成后合并回 develop
  3. 功能积攒足够,拉 release 分支准备发布
  4. Release 测试通过后合并到 main 打 Tag,同时合回 develop
  5. 线上出 Bug 时从 mainhotfix 分支紧急修复

5. Git Flow vs 其他分支模型

5.1 对比 GitHub Flow

维度 Git Flow GitHub Flow
分支数量 5 种(main/develop/feature/release/hotfix) 2 种(main + feature)
发布节奏 有计划发布 持续部署
适用场景 版本发布型项目 Web 应用 / SaaS
复杂度 较高 简单
develop 分支

5.2 对比 Trunk-Based Development

维度 Git Flow Trunk-Based
主分支 main main(即 trunk)
Feature 分支 短期存在 极短生命周期(<1天)
发布方式 Release 分支 Feature Flag 控制
适用团队 需要严格发布流程 高度成熟的 CI/CD 团队

选择建议

  • 选 Git Flow:有明确版本号、计划发布周期、多人协作中大型项目
  • 选 GitHub Flow:Web 应用、持续部署、小团队快速迭代
  • 选 Trunk-Based:CI/CD 成熟、Feature Flag 体系完善、追求极致集成频率

6. 实战配置:用 git-flow 工具简化操作

git-flow 是一个 Git 扩展工具,将上述流程封装为简短命令:

# 安装(macOS)
brew install git-flow

# 安装(Ubuntu)
apt-get install git-flow

# 初始化(交互式配置分支名)
git flow init

# Feature 操作
git flow feature start user-auth        # 创建 feature 分支
git flow feature finish user-auth       # 完成 feature(合并+删除)

# Release 操作
git flow release start 1.2.0            # 创建 release 分支
git flow release finish 1.2.0           # 完成 release(合并+打Tag+删除)

# Hotfix 操作
git flow hotfix start critical-bug      # 创建 hotfix 分支
git flow hotfix finish critical-bug     # 完成 hotfix(合并+打Tag+删除)

7. 常见踩坑与最佳实践

❌ 常见错误

错误 后果 正确做法
Feature 分支长期不合并 冲突地狱 控制在 2 周内,定期 rebase develop
Release 分支加新功能 发布延期 代码冻结后只修 Bug
Hotfix 忘了合回 develop 下个版本复发 Bug 合并到 main develop
在 develop 上直接提交 分支模型形同虚设 所有变更走 feature 分支
不用 --no-ff 丢失分支历史 合并时始终使用 --no-ff

✅ 最佳实践

  1. 分支命名要规范feature/JIRA-123-user-auth,方便追溯需求来源。
  2. CI 跑在所有分支上:确保 feature 分支在合并前就是可构建的。
  3. Code Review 必不可少:feature → develop 的合并必须经过 Review。
  4. Tag 遵循语义化版本vMAJOR.MINOR.PATCH,如 v1.2.1
  5. 定期清理远程分支:已合并的 feature 分支及时删除,避免分支膨胀。
  6. 保护 main 和 develop:设置分支保护规则,禁止直接 push。

8. 总结

Git Flow 的本质是为团队建立一套关于代码去向的约定。它不是银弹,但在以下场景中确实能显著降低协作混乱:

  • ✅ 多人并行开发多个功能
  • ✅ 需要同时维护多个线上版本
  • ✅ 有计划发布节奏的版本型产品
  • ✅ 需要紧急修复线上问题但不想打断开发

记住:流程服务于效率,而非效率服务于流程。如果团队规模小、部署频繁,GitHub Flow 可能是更务实的选择。选择适合团队的模型,然后坚持执行,才是最重要的。


参考资源

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐