返回博客
技术 2025年2月13日 4 分钟阅读 · 819 字
Git 工作流详解:Git Flow、GitHub Flow 与 Trunk Based 的选型
三种主流 Git 分支策略的对比分析,以及在不同团队规模和发布周期下的选择建议。
#Git
#版本控制
#团队协作
#DevOps
本文由 AI 辅助生成,经人工审核发布
三种工作流概览
| 工作流 | 适用场景 | 分支数量 | 发布模式 | 复杂度 |
|---|---|---|---|---|
| Git Flow | 有版本号的产品 | 5+ | 定期发布 | 高 |
| GitHub Flow | Web 应用 | 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
五种分支
| 分支 | 命名 | 来源 | 合并到 |
|---|---|---|---|
| main | main | - | - |
| develop | develop | main | main(发布时) |
| feature | feature/* | develop | develop |
| release | release/* | develop | main + develop |
| hotfix | hotfix/* | main | main + 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 使用的简化模型,只有 main 和 feature 分支:
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 | 新功能 |
| fix | Bug 修复 |
| 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)。