返回博客
技术 2025年2月13日 4 分钟阅读 · 819 字

Git 工作流详解:Git Flow、GitHub Flow 与 Trunk Based 的选型

三种主流 Git 分支策略的对比分析,以及在不同团队规模和发布周期下的选择建议。

#Git #版本控制 #团队协作 #DevOps
本文由 AI 辅助生成,经人工审核发布

三种工作流概览

工作流适用场景分支数量发布模式复杂度
Git Flow有版本号的产品5+定期发布
GitHub FlowWeb 应用2持续部署
Trunk Based高频发布大团队1-2多次/天

Git Flow

Vincent Driessen 在 2010 年提出,最完整的分支模型:

main (生产环境)
 ├── release/v1.2.0
 │    └── develop (集成分支)
 │         ├── feature/user-auth
 │         ├── feature/payment
 │         └── feature/search
 ├── hotfix/critical-bug
 └── tag: v1.1.0

五种分支

分支命名来源合并到
mainmain--
developdevelopmainmain(发布时)
featurefeature/*developdevelop
releaserelease/*developmain + develop
hotfixhotfix/*mainmain + develop

操作流程

# 开始新功能
git checkout develop
git checkout -b feature/user-auth

# 开发完成后合并
git checkout develop
git merge --no-ff feature/user-auth
git branch -d feature/user-auth

# 准备发布
git checkout -b release/v1.2.0 develop
# 修复 bug、更新版本号
git checkout main
git merge --no-ff release/v1.2.0
git tag -a v1.2.0
git checkout develop
git merge --no-ff release/v1.2.0

# 紧急修复
git checkout -b hotfix/critical-bug main
git checkout main
git merge --no-ff hotfix/critical-bug
git tag -a v1.2.1
git checkout develop
git merge --no-ff hotfix/critical-bug

优缺点

优点:版本管理严格,release 分支可以冻结功能并专注修 bug。

缺点:分支太多,合并复杂。对于持续部署的 Web 应用来说过于笨重。

GitHub Flow

GitHub 使用的简化模型,只有 mainfeature 分支:

main ─────●─────●─────●─────●─────
           \   /       \   /
feature    ●─●         ●─●

流程

# 1. 从 main 创建分支
git checkout -b feature/dark-mode

# 2. 开发并提交
git add . && git commit -m "feat: add dark mode"

# 3. 推送并创建 PR
git push origin feature/dark-mode

# 4. Code Review

# 5. 合并到 main 后自动部署
git checkout main
git pull

核心原则

  • main 分支永远可部署
  • 任何修改都从 main 创建分支
  • 合并前必须通过 CI 和 Code Review
  • 合并后立即部署

适合:SaaS 产品、持续部署的 Web 应用、小团队。

Trunk-Based Development

Google、Facebook 等大厂使用的高频集成模式:

main ──●──●──●──●──●──●──●──●──●──
        \  /\  /      \  /
short    ●─●  ●         ●
branch

核心思想

所有人都直接向 main 提交,分支生命周期极短(通常 < 24 小时)。未完成的功能用 Feature Flag 控制。

Feature Flag

// 未完成的功能用 flag 控制,不影响生产环境
if (featureFlags.isEnabled('new-checkout')) {
  showNewCheckout();
} else {
  showOldCheckout();
}
// Laravel 中使用 laravel/pennant
use Laravel\Pennant\Feature;

if (Feature::active('new-checkout')) {
    return view('checkout.new');
}
return view('checkout.old');

优点

  • 减少合并冲突(分支生命周期短)
  • 持续集成更有效(每天多次集成)
  • 快速反馈

缺点

  • 需要成熟的 CI/CD 基础设施
  • 需要 Feature Flag 系统
  • 对开发者纪律要求高

Commit Message 规范

推荐使用 Conventional Commits:

<type>(<scope>): <subject>

<body>

<footer>

Type

Type含义
feat新功能
fixBug 修复
docs文档
style格式(不影响逻辑)
refactor重构
perf性能优化
test测试
chore构建/工具

示例

feat(auth): 添加 OAuth2 GitHub 登录

- 集成 Laravel Socialite
- 添加 GitHub 回调路由
- 用户表新增 provider_id 字段

Closes #142

.gitignore 最佳实践

# 依赖
node_modules/
vendor/

# 构建产物
dist/
build/

# 环境变量
.env
.env.local

# IDE
.vscode/
.idea/

# OS
.DS_Store
Thumbs.db

# 日志
*.log
storage/logs/

总结

  • 产品型应用(有版本号、定期发布)→ Git Flow
  • Web 应用(持续部署、小团队)→ GitHub Flow
  • 大型团队(高频发布、强 CI/CD)→ Trunk Based + Feature Flag

大多数中小型团队的最佳选择是 GitHub Flow——简单、高效、够用。随着团队规模增长,再逐步引入 Trunk Based 的实践(短分支、Feature Flag)。