Skip to content

Git Flow 工作流指南

🎯 学习目标

Git Flow 是由 Vincent Driessen 在 2010 年提出的一套基于 Git 的分支管理策略。它定义了一个围绕项目发布的严格分支模型,为管理大型项目提供了一个健壮的框架。

核心理念: 通过定义清晰的分支角色和合并策略,让团队协作更加规范,代码管理更加有序。


一、🌳 分支类型详解

Git Flow 定义了五种分支类型,每种分支都有特定的用途和生命周期。

1.1 主分支(长期分支)

分支用途特点生命周期
🔵 master/main生产环境代码只包含正式发布的代码,每次合并都应打版本标签永久存在
🟢 develop开发主分支最新的开发代码集成分支,合并来源:feature、release、hotfix永久存在

1.2 支持分支(临时分支)

分支命名源分支合并到用途
🟡 featurefeature/*developdevelop新功能开发
🟣 releaserelease/*developmaster 和 develop版本发布准备
🔴 hotfixhotfix/*mastermaster 和 develop生产环境紧急修复

二、🚀 完整工作流程

2.1 初始化仓库

bash
# 创建并初始化 Git 仓库
git init

# 创建 develop 分支
git checkout -b develop
git push -u origin develop

2.2 Feature 开发流程

① 创建 feature 分支

bash
# 从 develop 分支创建新功能分支
git checkout develop
git pull origin develop
git checkout -b feature/user-authentication

② 开发功能

bash
# 正常开发,提交代码
git add .
git commit -m "feat: add user login functionality"
git commit -m "feat: add user registration"

③ 合并回 develop

bash
# 更新 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 分支

bash
# 从 develop 创建 release 分支
git checkout develop
git pull origin develop
git checkout -b release/1.0.0

② 准备发布

bash
# 更新版本号、修复 bug、更新文档
git add .
git commit -m "chore: bump version to 1.0.0"
git commit -m "docs: update CHANGELOG"

③ 完成发布

bash
# 合并到 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.0

2.4 Hotfix 紧急修复流程

① 创建 hotfix 分支

bash
# 从 master 创建 hotfix 分支
git checkout master
git pull origin master
git checkout -b hotfix/critical-bug-fix

② 修复问题

bash
# 修复 bug
git add .
git commit -m "fix: resolve critical security vulnerability"

③ 合并并发布

bash
# 合并到 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 扩展

bash
# 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 | bash

3.2 使用 git-flow 命令

初始化:

bash
git flow init
# 按提示设置分支命名规则,通常使用默认值即可

Feature 操作:

bash
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 操作:

bash
git flow release start 1.0.0      # 开始新版本
git flow release finish 1.0.0     # 完成版本(自动合并到 master 和 develop)
git flow release publish 1.0.0    # 发布到远程

Hotfix 操作:

bash
git flow hotfix start critical-bug-fix   # 开始热修复
git flow hotfix finish critical-bug-fix  # 完成热修复(自动合并到 master 和 develop)

四、📊 Git Flow vs 其他工作流

特性Git FlowGitHub FlowGitLab Flow
复杂度较高简单中等
分支数量5 种2 种(main + feature)3 种
适用场景定期发布的大型项目持续部署的项目多环境部署项目
发布周期计划发布持续发布灵活
学习曲线陡峭平缓中等

五、✅ 最佳实践

5.1 提交信息规范

使用 Conventional Commits 规范:

bash
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 分支命名规范

bash
# 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-123

5.3 版本标签规范

使用 Semantic Versioning

bash
# 格式: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 自动化建议

yaml
# .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 差异过大

解决方案:

bash
# 定期将 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 分支测试发现重大问题

解决方案:

bash
# 在 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 修复后重新创建 release

6.3 hotfix 与正在进行的 release 冲突

场景: 同时存在 release 和 hotfix 分支

解决方案:

bash
# 完成 hotfix 后,也要合并到 release 分支
git checkout release/1.1.0
git merge --no-ff hotfix/critical-fix

6.4 忘记删除已合并的分支

场景: 本地和远程存在大量已合并的旧分支

解决方案:

bash
# 删除本地已合并的分支
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

七、📝 实战案例

开发一个新功能并发布

bash
# 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 文件:

bash
#!/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 0

10.2 分支保护规则

在 GitHub/GitLab 中设置:

master 分支保护:

  • ✅ 禁止直接推送
  • ✅ 要求 PR 审核
  • ✅ 要求状态检查通过
  • ✅ 要求分支最新

develop 分支保护:

  • ✅ 要求 PR 审核
  • ✅ 要求状态检查通过

10.3 小技巧

快速切换分支:

bash
git checkout -         # 回到上一个分支
git checkout develop   # 快速切换到 develop
git checkout master    # 快速切换到 master

查看分支关系图:

bash
# 图形化显示分支历史
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

批量操作:

bash
# 查看所有分支最后提交时间
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