Skip to content

Git Flow 工作流

概述

Git Flow 是由 Vincent Driessen 提出的一种经典 Git 分支管理模型,它定义了一套严格的分支模型,为软件开发提供了一个健壮的框架。Git Flow 特别适合具有计划性发布周期的项目。

分支结构

主要分支

Git Flow 包含两个长期存在的主要分支:

master 分支

  • 永远处于生产就绪状态
  • 只能通过合并 release 或 hotfix 分支来更新
  • 每次合并都应该打一个标签

develop 分支

  • 集成分支,包含下一版本的最新开发功能
  • 从 master 分支创建
  • 特性分支完成后合并到此分支

辅助分支

feature 分支(特性分支)

  • 从 develop 分支创建
  • 开发完成后合并回 develop 分支
  • 命名规范: feature/*feature-*
bash
# 创建特性分支
git checkout develop
git checkout -b feature/user-authentication

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

# 推送到远程
git push origin develop

release 分支(发布分支)

  • 从 develop 分支创建
  • 用于发布前的准备工作
  • 合并到 master 和 develop 分支
  • 命名规范: release/*release-*
bash
# 创建发布分支
git checkout develop
git checkout -b release/1.0.0

# 发布准备工作(版本号更新、文档完善等)
./bump-version.sh 1.0.0

# 合并到 master
git checkout master
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "Release version 1.0.0"

# 合并回 develop
git checkout develop
git merge --no-ff release/1.0.0

# 删除发布分支
git branch -d release/1.0.0

hotfix 分支(热修复分支)

  • 从 master 分支创建
  • 用于紧急修复生产环境问题
  • 合并到 master 和 develop 分支
  • 命名规范: hotfix/*hotfix-*
bash
# 创建热修复分支
git checkout master
git checkout -b hotfix/1.0.1

# 修复问题
git commit -m "Fix critical security issue"

# 合并到 master
git checkout master
git merge --no-ff hotfix/1.0.1
git tag -a v1.0.1 -m "Hotfix version 1.0.1"

# 合并到 develop
git checkout develop
git merge --no-ff hotfix/1.0.1

# 删除热修复分支
git branch -d hotfix/1.0.1

工作流程

完整开发流程示例

bash
# 1. 初始化仓库
git init
git commit --allow-empty -m "Initial commit"

# 2. 创建 develop 分支
git checkout -b develop

# 3. 开发新特性
git checkout -b feature/login develop
# ... 开发工作 ...
git commit -m "Add login functionality"
git commit -m "Add login tests"

# 4. 完成特性开发
git checkout develop
git merge --no-ff feature/login
git branch -d feature/login

# 5. 准备发布
git checkout -b release/1.0.0 develop
# ... 发布准备工作 ...
git commit -m "Bump version to 1.0.0"

# 6. 完成发布
git checkout master
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "Version 1.0.0"

git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0

# 7. 紧急修复(如果需要)
git checkout -b hotfix/1.0.1 master
# ... 修复工作 ...
git commit -m "Fix critical bug"

git checkout master
git merge --no-ff hotfix/1.0.1
git tag -a v1.0.1 -m "Version 1.0.1"

git checkout develop
git merge --no-ff hotfix/1.0.1
git branch -d hotfix/1.0.1

使用 Git Flow 工具

Git Flow 提供了命令行工具来简化操作:

bash
# 安装 Git Flow
# macOS
brew install git-flow

# Ubuntu/Debian
sudo apt-get install git-flow

# 初始化 Git Flow
git flow init

# 特性分支操作
git flow feature start user-auth
git flow feature finish user-auth
git flow feature publish user-auth

# 发布分支操作
git flow release start 1.0.0
git flow release finish 1.0.0

# 热修复分支操作
git flow hotfix start 1.0.1
git flow hotfix finish 1.0.1

分支策略图示

master     ──●────●────●────●────●──
              \         /      \
develop   ●──●──●──●──●──●──●──●──●──●
              /      \        \
feature   ●──●        ●──●──●
release            ●──●──●
hotfix                  ●──●

适用场景

适合使用 Git Flow 的场景

  1. 计划性发布项目

    • 有明确的版本发布周期
    • 需要维护多个版本
    • 发布时间窗口固定
  2. 大型团队协作

    • 团队成员较多
    • 需要严格的代码审查流程
    • 有专门的测试和发布团队
  3. 企业级应用

    • 对稳定性要求高
    • 需要严格的版本控制
    • 有完善的测试流程
  4. 长期维护项目

    • 项目生命周期长
    • 需要支持多个版本
    • 有持续的维护需求

不适合使用 Git Flow 的场景

  1. 持续部署项目

    • 需要快速迭代
    • 每天多次部署
    • 建议使用 GitHub Flow 或 Trunk Based
  2. 小型团队

    • 团队成员少于 5 人
    • 流程过于复杂
    • 增加不必要的开销
  3. 初创项目

    • 需求变化快
    • 快速试错阶段
    • 建议使用更简单的流程

最佳实践

分支管理

bash
# 定期清理已合并的分支
git branch --merged develop | grep -v "^\*\|  develop\|  master" | xargs -n 1 git branch -d

# 同步远程分支列表
git fetch -p

# 查看分支状态
git branch -vv

提交规范

bash
# 特性分支提交
git commit -m "feat: add user authentication"

# 热修复分支提交
git commit -m "fix: resolve login timeout issue"

# 发布分支提交
git commit -m "chore: bump version to 1.0.0"

标签管理

bash
# 创建带注释的标签
git tag -a v1.0.0 -m "Release version 1.0.0"

# 推送标签到远程
git push origin v1.0.0

# 推送所有标签
git push origin --tags

# 删除远程标签
git push origin --delete v1.0.0

常见问题

如何处理长期运行的特性分支?

bash
# 定期从 develop 分支更新
git checkout feature/long-feature
git merge develop

# 或使用 rebase 保持提交历史清晰
git checkout feature/long-feature
git rebase develop

如何撤销错误的合并?

bash
# 撤销最近一次合并
git checkout develop
git reset --hard HEAD~1

# 或使用 revert 保留历史
git revert -m 1 <merge-commit-hash>

如何处理发布延期?

bash
# 继续在 release 分支上工作
git checkout release/1.0.0

# 如果需要新的特性,从 develop 分支 cherry-pick
git cherry-pick <commit-hash>

总结

Git Flow 是一个成熟的工作流模型,特别适合需要严格版本控制和计划性发布的项目。它的主要优势包括:

  • 清晰的分支结构: 每个分支都有明确的用途
  • 并行开发支持: 可以同时开发多个特性
  • 版本管理: 便于维护多个版本
  • 紧急修复: 提供了专门的热修复流程

但也需要注意:

  • 复杂性: 分支模型较为复杂,需要学习成本
  • 开销: 对于小型团队可能过于繁琐
  • 适用性: 不适合持续部署场景

在选择工作流时,应该根据团队规模、项目特点和发布需求来决定是否使用 Git Flow。