Git Flow 工作流指南
🎯 学习目标
Git Flow 是由 Vincent Driessen 在 2010 年提出的一套基于 Git 的分支管理策略。它定义了一个围绕项目发布的严格分支模型,为管理大型项目提供了一个健壮的框架。
核心理念: 通过定义清晰的分支角色和合并策略,让团队协作更加规范,代码管理更加有序。
一、🌳 分支类型详解
Git Flow 定义了五种分支类型,每种分支都有特定的用途和生命周期。
1.1 主分支(长期分支)
| 分支 | 用途 | 特点 | 生命周期 |
|---|---|---|---|
| 🔵 master/main | 生产环境代码 | 只包含正式发布的代码,每次合并都应打版本标签 | 永久存在 |
| 🟢 develop | 开发主分支 | 最新的开发代码集成分支,合并来源:feature、release、hotfix | 永久存在 |
1.2 支持分支(临时分支)
| 分支 | 命名 | 源分支 | 合并到 | 用途 |
|---|---|---|---|---|
| 🟡 feature | feature/* | develop | develop | 新功能开发 |
| 🟣 release | release/* | develop | master 和 develop | 版本发布准备 |
| 🔴 hotfix | hotfix/* | master | master 和 develop | 生产环境紧急修复 |
二、🚀 完整工作流程
2.1 初始化仓库
# 创建并初始化 Git 仓库
git init
# 创建 develop 分支
git checkout -b develop
git push -u origin develop2.2 Feature 开发流程
① 创建 feature 分支
# 从 develop 分支创建新功能分支
git checkout develop
git pull origin develop
git checkout -b feature/user-authentication② 开发功能
# 正常开发,提交代码
git add .
git commit -m "feat: add user login functionality"
git commit -m "feat: add user registration"③ 合并回 develop
# 更新 develop 分支
git checkout develop
git pull origin develop
# 合并 feature 分支
git merge --no-ff feature/user-authentication
# 推送到远程
git push origin develop
# 删除 feature 分支
git branch -d feature/user-authentication💡 --no-ff 参数
使用 --no-ff(no fast-forward)参数可以保留分支历史记录,让提交历史更清晰。
2.3 Release 发布流程
① 创建 release 分支
# 从 develop 创建 release 分支
git checkout develop
git pull origin develop
git checkout -b release/1.0.0② 准备发布
# 更新版本号、修复 bug、更新文档
git add .
git commit -m "chore: bump version to 1.0.0"
git commit -m "docs: update CHANGELOG"③ 完成发布
# 合并到 master
git checkout master
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin master --tags
# 合并回 develop
git checkout develop
git merge --no-ff release/1.0.0
git push origin develop
# 删除 release 分支
git branch -d release/1.0.02.4 Hotfix 紧急修复流程
① 创建 hotfix 分支
# 从 master 创建 hotfix 分支
git checkout master
git pull origin master
git checkout -b hotfix/critical-bug-fix② 修复问题
# 修复 bug
git add .
git commit -m "fix: resolve critical security vulnerability"③ 合并并发布
# 合并到 master
git checkout master
git merge --no-ff hotfix/critical-bug-fix
git tag -a v1.0.1 -m "Hotfix version 1.0.1"
git push origin master --tags
# 合并到 develop
git checkout develop
git merge --no-ff hotfix/critical-bug-fix
git push origin develop
# 删除 hotfix 分支
git branch -d hotfix/critical-bug-fix三、🛠️ Git Flow 工具
3.1 安装 git-flow 扩展
# macOS
brew install git-flow
# Linux (Debian/Ubuntu)
sudo apt-get install git-flow
# Windows (通过 Git Bash)
wget -q -O - --no-check-certificate https://raw.github.com/petervanderdoes/gitflow-avh/develop/contrib/gitflow-installer.sh install stable | bash3.2 使用 git-flow 命令
初始化:
git flow init
# 按提示设置分支命名规则,通常使用默认值即可Feature 操作:
git flow feature start user-authentication # 开始新功能
git flow feature finish user-authentication # 完成功能(自动合并到 develop)
git flow feature publish user-authentication # 发布功能到远程
git flow feature pull origin user-authentication # 获取远程功能分支Release 操作:
git flow release start 1.0.0 # 开始新版本
git flow release finish 1.0.0 # 完成版本(自动合并到 master 和 develop)
git flow release publish 1.0.0 # 发布到远程Hotfix 操作:
git flow hotfix start critical-bug-fix # 开始热修复
git flow hotfix finish critical-bug-fix # 完成热修复(自动合并到 master 和 develop)四、📊 Git Flow vs 其他工作流
| 特性 | Git Flow | GitHub Flow | GitLab Flow |
|---|---|---|---|
| 复杂度 | 较高 | 简单 | 中等 |
| 分支数量 | 5 种 | 2 种(main + feature) | 3 种 |
| 适用场景 | 定期发布的大型项目 | 持续部署的项目 | 多环境部署项目 |
| 发布周期 | 计划发布 | 持续发布 | 灵活 |
| 学习曲线 | 陡峭 | 平缓 | 中等 |
五、✅ 最佳实践
5.1 提交信息规范
使用 Conventional Commits 规范:
git commit -m "feat: add user authentication" # 功能
git commit -m "fix: resolve login timeout issue" # 修复
git commit -m "docs: update API documentation" # 文档
git commit -m "style: format code with prettier" # 样式
git commit -m "refactor: simplify user service logic" # 重构
git commit -m "perf: optimize database queries" # 性能
git commit -m "test: add unit tests for auth module" # 测试
git commit -m "build: update webpack config" # 构建
git commit -m "ci: add GitHub Actions workflow" # CI/CD
git commit -m "chore: update dependencies" # 杂项5.2 分支命名规范
# Feature 分支
feature/user-auth
feature/payment-integration
feature/JIRA-1234-add-search
# Release 分支
release/1.0.0
release/2.1.0-beta
# Hotfix 分支
hotfix/security-patch
hotfix/critical-bug-1235.3 版本标签规范
# 格式:MAJOR.MINOR.PATCH
v1.0.0 # 主版本.次版本.修订版本
# 示例
git tag -a v1.0.0 -m "Initial release"
git tag -a v1.1.0 -m "Add new features"
git tag -a v1.1.1 -m "Bug fixes"
git tag -a v2.0.0 -m "Breaking changes"5.4 代码审查要点
- ✅ 所有 feature 分支合并前必须经过 Code Review
- ✅ 使用 Pull Request/Merge Request 进行合并
- ✅ 要求至少一名团队成员审批
- ✅ 通过所有自动化测试
- ✅ 解决所有代码冲突
5.5 自动化建议
# .github/workflows/gitflow.yml
name: Git Flow CI
on:
push:
branches: [develop, master]
pull_request:
branches: [develop, master]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run tests
run: npm test
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Lint code
run: npm run lint六、🚧 常见问题与解决方案
6.1 feature 分支过期
场景: 长期开发的 feature 分支与 develop 差异过大
解决方案:
# 定期将 develop 合并到 feature 分支
git checkout feature/long-running-feature
git merge develop
# 解决冲突
git add .
git commit -m "merge: sync with develop"6.2 release 分支发现严重 bug
场景: release 分支测试发现重大问题
解决方案:
# 在 release 分支修复
git checkout release/1.0.0
# 修复 bug
git commit -m "fix: resolve critical issue in release"
# 如果问题过于严重,考虑废弃该 release
git branch -D release/1.0.0
# 在 develop 修复后重新创建 release6.3 hotfix 与正在进行的 release 冲突
场景: 同时存在 release 和 hotfix 分支
解决方案:
# 完成 hotfix 后,也要合并到 release 分支
git checkout release/1.1.0
git merge --no-ff hotfix/critical-fix6.4 忘记删除已合并的分支
场景: 本地和远程存在大量已合并的旧分支
解决方案:
# 删除本地已合并的分支
git branch --merged | grep -v "\*" | grep -v "master\|main\|develop" | xargs -n 1 git branch -d
# 删除远程已合并的分支
git remote prune origin
# 或使用脚本批量清理
git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin七、📝 实战案例
开发一个新功能并发布
# 1️⃣ 创建 feature 分支
git checkout develop
git checkout -b feature/shopping-cart
# 2️⃣ 开发功能(多次提交)
git commit -m "feat: add cart data model"
git commit -m "feat: implement add to cart functionality"
git commit -m "feat: add cart UI components"
git commit -m "test: add cart unit tests"
# 3️⃣ 完成功能开发,合并到 develop
git checkout develop
git merge --no-ff feature/shopping-cart
git push origin develop
git branch -d feature/shopping-cart
# 4️⃣ 准备发布 v1.2.0
git checkout -b release/1.2.0
# 5️⃣ 发布准备工作
git commit -m "chore: bump version to 1.2.0"
git commit -m "docs: update changelog for v1.2.0"
# 6️⃣ 完成发布
git checkout master
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release v1.2.0: Add shopping cart feature"
git push origin master --tags
git checkout develop
git merge --no-ff release/1.2.0
git push origin develop
git branch -d release/1.2.0
# 7️⃣ 发现生产环境 bug,创建 hotfix
git checkout master
git checkout -b hotfix/cart-calculation-error
# 8️⃣ 修复 bug
git commit -m "fix: correct cart total calculation"
# 9️⃣ 完成 hotfix
git checkout master
git merge --no-ff hotfix/cart-calculation-error
git tag -a v1.2.1 -m "Hotfix v1.2.1: Fix cart calculation"
git push origin master --tags
git checkout develop
git merge --no-ff hotfix/cart-calculation-error
git push origin develop
git branch -d hotfix/cart-calculation-error八、🎯 何时使用 Git Flow?
✅ 适合使用 Git Flow
- 📦 有明确的版本发布计划
- 👥 团队规模较大(5 人以上)
- 🏢 需要同时维护多个版本
- 🔒 需要严格的代码审查流程
- 📱 移动应用或桌面应用开发
- 🎮 游戏开发
❌ 不适合使用 Git Flow
- 🚀 需要持续部署(CD)
- 👤 个人项目或小团队(2-3 人)
- ⚡ 快速迭代的 Web 应用
- 🔧 开源项目(GitHub Flow 更适合)
- 📊 数据科学项目
九、🔗 相关资源
十、📚 进阶学习
10.1 Git Hooks 集成
创建 .git/hooks/pre-commit 文件:
#!/bin/bash
# 提交前运行测试和代码检查
echo "Running pre-commit checks..."
# 运行测试
npm test
if [ $? -ne 0 ]; then
echo "❌ Tests failed. Commit aborted."
exit 1
fi
# 运行 linter
npm run lint
if [ $? -ne 0 ]; then
echo "❌ Linting failed. Commit aborted."
exit 1
fi
echo "✅ All checks passed!"
exit 010.2 分支保护规则
在 GitHub/GitLab 中设置:
master 分支保护:
- ✅ 禁止直接推送
- ✅ 要求 PR 审核
- ✅ 要求状态检查通过
- ✅ 要求分支最新
develop 分支保护:
- ✅ 要求 PR 审核
- ✅ 要求状态检查通过
10.3 小技巧
快速切换分支:
git checkout - # 回到上一个分支
git checkout develop # 快速切换到 develop
git checkout master # 快速切换到 master查看分支关系图:
# 图形化显示分支历史
git log --oneline --graph --all
# 或使用别名
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg批量操作:
# 查看所有分支最后提交时间
git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(refname:short)'
# 删除所有本地 feature 分支
git branch | grep 'feature/' | xargs git branch -D
# 更新所有远程分支
git fetch --all --prune💡 总结
Git Flow 是一个强大而灵活的分支管理策略,适合需要明确发布周期的项目。虽然学习曲线较陡,但掌握后能大大提高团队协作效率。记住:选择工作流不是目的,提高团队效率和代码质量才是最终目标。
📌 下一步
实践是最好的老师!尝试在你的项目中应用 Git Flow,逐步调整适合团队的工作流程。
最后更新:2025-11-23 | 作者:Hugo