Skip to content

Git Flow

Git Flow 是一个基于 Git 分支的工作流程模型,由 Vincent Driessen 提出。它为不同类型的分支定义了严格的规则,特别适合有计划发布周期的项目。

Git Flow 概述

什么是 Git Flow?

Git Flow 是一套分支管理策略,它定义了一个围绕项目发布的严格分支模型。这个模型为不同类型的分支分配了特定的角色,并定义了它们应该如何以及何时进行交互。

Git Flow 的优势

  • 🎯 清晰的分支结构:每种分支都有明确的用途
  • 🚀 并行开发:支持多个功能同时开发
  • 🔄 稳定的发布流程:规范化的发布管理
  • 🐛 快速热修复:紧急问题的快速响应机制
  • 📈 可扩展性:适合大型团队和复杂项目

Git Flow 分支模型

主要分支

1. main/master 分支

  • 用途:生产环境的稳定代码
  • 特点:只包含发布版本的代码
  • 操作:只接受来自 release 和 hotfix 分支的合并
bash
# main 分支应该始终是可部署的
git checkout main
git log --oneline  # 查看发布历史

2. develop 分支

  • 用途:开发环境的集成分支
  • 特点:包含下一个发布版本的最新开发成果
  • 操作:接受来自 feature 分支的合并
bash
# 创建 develop 分支
git checkout -b develop main

# 或者从远程检出
git checkout -b develop origin/develop

辅助分支

1. Feature 分支

  • 命名规范feature/功能名称feature/issue-编号
  • 生命周期:从 develop 分支创建,完成后合并回 develop
  • 用途:开发新功能
bash
# 创建功能分支
git checkout -b feature/user-authentication develop

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

2. Release 分支

  • 命名规范release/版本号
  • 生命周期:从 develop 分支创建,完成后合并到 main 和 develop
  • 用途:准备新版本发布
bash
# 创建发布分支
git checkout -b release/1.2.0 develop

# 发布完成后合并到 main
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release version 1.2.0"

# 合并回 develop
git checkout develop
git merge --no-ff release/1.2.0
git branch -d release/1.2.0

3. Hotfix 分支

  • 命名规范hotfix/版本号hotfix/问题描述
  • 生命周期:从 main 分支创建,完成后合并到 main 和 develop
  • 用途:修复生产环境的紧急问题
bash
# 创建热修复分支
git checkout -b hotfix/1.2.1 main

# 修复完成后合并到 main
git checkout main
git merge --no-ff hotfix/1.2.1
git tag -a v1.2.1 -m "Hotfix version 1.2.1"

# 合并回 develop
git checkout develop
git merge --no-ff hotfix/1.2.1
git branch -d hotfix/1.2.1

Git Flow 工具安装

安装 git-flow 扩展

macOS

bash
# 使用 Homebrew
brew install git-flow-avh

# 使用 MacPorts
sudo port install git-flow

Ubuntu/Debian

bash
sudo apt-get install git-flow

Windows

bash
# 使用 Chocolatey
choco install gitflow-avh

# 或者下载安装包
# https://github.com/petervanderdoes/gitflow-avh/wiki/Installing-on-Windows

验证安装

bash
git flow version

使用 Git Flow 工具

初始化 Git Flow

bash
# 在现有仓库中初始化 Git Flow
git flow init

# 使用默认设置初始化
git flow init -d

初始化过程会询问分支命名约定:

Branch name for production releases: [main]
Branch name for "next release" development: [develop]
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []

Feature 分支操作

开始新功能

bash
# 创建并切换到新功能分支
git flow feature start user-login

# 等同于
git checkout -b feature/user-login develop

完成功能开发

bash
# 完成功能开发
git flow feature finish user-login

# 这会执行以下操作:
# 1. 合并 feature/user-login 到 develop
# 2. 删除 feature/user-login 分支
# 3. 切换回 develop 分支

发布功能分支

bash
# 推送功能分支到远程
git flow feature publish user-login

# 获取远程功能分支
git flow feature pull origin user-login

Release 分支操作

开始新发布

bash
# 创建发布分支
git flow release start 1.2.0

# 等同于
git checkout -b release/1.2.0 develop

完成发布

bash
# 完成发布
git flow release finish 1.2.0

# 这会执行以下操作:
# 1. 合并 release/1.2.0 到 main
# 2. 创建标签 v1.2.0
# 3. 合并 release/1.2.0 到 develop
# 4. 删除 release/1.2.0 分支

发布 Release 分支

bash
# 推送发布分支
git flow release publish 1.2.0

Hotfix 分支操作

开始热修复

bash
# 创建热修复分支
git flow hotfix start 1.2.1

# 等同于
git checkout -b hotfix/1.2.1 main

完成热修复

bash
# 完成热修复
git flow hotfix finish 1.2.1

# 这会执行以下操作:
# 1. 合并 hotfix/1.2.1 到 main
# 2. 创建标签 v1.2.1
# 3. 合并 hotfix/1.2.1 到 develop
# 4. 删除 hotfix/1.2.1 分支

手动实现 Git Flow

如果不使用 git-flow 工具,也可以手动实现 Git Flow 工作流:

项目初始化

bash
# 创建项目
mkdir my-project
cd my-project
git init

# 创建初始提交
echo "# My Project" > README.md
git add README.md
git commit -m "Initial commit"

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

功能开发流程

bash
# 1. 从 develop 创建功能分支
git checkout develop
git pull origin develop
git checkout -b feature/user-registration

# 2. 开发功能
echo "用户注册功能" > registration.js
git add registration.js
git commit -m "添加用户注册功能"

echo "注册表单验证" >> registration.js
git add registration.js
git commit -m "添加注册表单验证"

# 3. 推送功能分支(可选,用于协作)
git push -u origin feature/user-registration

# 4. 完成功能开发,合并到 develop
git checkout develop
git pull origin develop
git merge --no-ff feature/user-registration
git push origin develop

# 5. 删除功能分支
git branch -d feature/user-registration
git push origin --delete feature/user-registration

发布流程

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

# 2. 发布准备工作(版本号更新、文档等)
echo "version: 1.0.0" > version.txt
git add version.txt
git commit -m "Bump version to 1.0.0"

# 3. 修复发布相关的 bug
echo "修复发布问题" >> bugfix.txt
git add bugfix.txt
git commit -m "修复发布相关问题"

# 4. 合并到 main 并打标签
git checkout main
git pull origin main
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin main
git push origin v1.0.0

# 5. 合并回 develop
git checkout develop
git merge --no-ff release/1.0.0
git push origin develop

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

热修复流程

bash
# 1. 从 main 创建热修复分支
git checkout main
git pull origin main
git checkout -b hotfix/1.0.1

# 2. 修复紧急问题
echo "修复安全漏洞" > security-fix.txt
git add security-fix.txt
git commit -m "修复安全漏洞"

# 3. 更新版本号
echo "version: 1.0.1" > version.txt
git add version.txt
git commit -m "Bump version to 1.0.1"

# 4. 合并到 main 并打标签
git checkout main
git merge --no-ff hotfix/1.0.1
git tag -a v1.0.1 -m "Hotfix version 1.0.1"
git push origin main
git push origin v1.0.1

# 5. 合并回 develop
git checkout develop
git merge --no-ff hotfix/1.0.1
git push origin develop

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

Git Flow 最佳实践

1. 分支命名规范

bash
# 功能分支
feature/user-authentication
feature/payment-integration
feature/issue-123

# 发布分支
release/1.0.0
release/2.1.0
release/v3.0.0-beta

# 热修复分支
hotfix/1.0.1
hotfix/security-patch
hotfix/critical-bug-fix

2. 提交信息规范

bash
# 功能开发
git commit -m "feat: 添加用户认证功能"
git commit -m "feat(auth): 实现 OAuth 登录"

# 发布准备
git commit -m "chore: 更新版本号到 1.2.0"
git commit -m "docs: 更新 CHANGELOG"

# 热修复
git commit -m "fix: 修复登录安全漏洞"
git commit -m "hotfix: 解决内存泄漏问题"

3. 版本标签规范

bash
# 语义化版本
git tag -a v1.0.0 -m "Major release 1.0.0"
git tag -a v1.1.0 -m "Minor release 1.1.0"
git tag -a v1.1.1 -m "Patch release 1.1.1"

# 预发布版本
git tag -a v2.0.0-alpha.1 -m "Alpha release 2.0.0-alpha.1"
git tag -a v2.0.0-beta.1 -m "Beta release 2.0.0-beta.1"
git tag -a v2.0.0-rc.1 -m "Release candidate 2.0.0-rc.1"

4. 代码审查流程

bash
# 功能分支推送后创建 Pull Request
git push -u origin feature/new-feature

# 在 GitHub/GitLab 中创建 PR/MR
# 目标分支:develop
# 审查者:团队成员
# 标签:feature, needs-review

# 审查通过后合并
git checkout develop
git merge --no-ff feature/new-feature

Git Flow 自动化

使用脚本自动化

bash
#!/bin/bash
# Git Flow 自动化脚本

# 开始新功能
start_feature() {
    local feature_name=$1
    if [ -z "$feature_name" ]; then
        echo "用法: start_feature <feature-name>"
        return 1
    fi
    
    git checkout develop
    git pull origin develop
    git checkout -b "feature/$feature_name"
    echo "已创建功能分支: feature/$feature_name"
}

# 完成功能
finish_feature() {
    local current_branch=$(git branch --show-current)
    if [[ $current_branch != feature/* ]]; then
        echo "错误: 当前不在功能分支上"
        return 1
    fi
    
    local feature_name=${current_branch#feature/}
    
    git checkout develop
    git pull origin develop
    git merge --no-ff "$current_branch"
    git push origin develop
    git branch -d "$current_branch"
    
    echo "功能分支 $current_branch 已合并并删除"
}

# 开始发布
start_release() {
    local version=$1
    if [ -z "$version" ]; then
        echo "用法: start_release <version>"
        return 1
    fi
    
    git checkout develop
    git pull origin develop
    git checkout -b "release/$version"
    echo "已创建发布分支: release/$version"
}

# 完成发布
finish_release() {
    local current_branch=$(git branch --show-current)
    if [[ $current_branch != release/* ]]; then
        echo "错误: 当前不在发布分支上"
        return 1
    fi
    
    local version=${current_branch#release/}
    
    # 合并到 main
    git checkout main
    git pull origin main
    git merge --no-ff "$current_branch"
    git tag -a "v$version" -m "Release version $version"
    git push origin main
    git push origin "v$version"
    
    # 合并回 develop
    git checkout develop
    git merge --no-ff "$current_branch"
    git push origin develop
    
    # 删除发布分支
    git branch -d "$current_branch"
    
    echo "发布 v$version 已完成"
}

CI/CD 集成

yaml
# .github/workflows/gitflow.yml
name: Git Flow CI/CD

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ develop ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Run tests
      run: |
        npm install
        npm test
    
    - name: Build
      run: npm run build

  deploy-staging:
    if: github.ref == 'refs/heads/develop'
    needs: test
    runs-on: ubuntu-latest
    steps:
    - name: Deploy to staging
      run: echo "Deploying to staging environment"

  deploy-production:
    if: github.ref == 'refs/heads/main'
    needs: test
    runs-on: ubuntu-latest
    steps:
    - name: Deploy to production
      run: echo "Deploying to production environment"

Git Flow 变体

GitHub Flow

简化版的 Git Flow,适合持续部署:

bash
# 1. 从 main 创建功能分支
git checkout -b feature/new-feature main

# 2. 开发并推送
git push -u origin feature/new-feature

# 3. 创建 Pull Request
# 4. 代码审查和测试
# 5. 合并到 main
# 6. 自动部署

GitLab Flow

结合了 Git Flow 和 GitHub Flow 的优点:

bash
# 环境分支
main          # 生产环境
pre-production # 预生产环境
staging       # 测试环境

# 功能开发
git checkout -b feature/new-feature main
# 开发完成后创建 MR 到 main

Microsoft Git Flow

适合企业级开发:

bash
# 长期分支
main          # 生产代码
develop       # 集成分支
release/*     # 发布分支

# 短期分支
feature/*     # 功能分支
bugfix/*      # 缺陷修复
hotfix/*      # 热修复

故障排除

常见问题

bash
# 问题1: git-flow 命令不存在
# 解决: 安装 git-flow 扩展
brew install git-flow-avh

# 问题2: 分支合并冲突
# 解决: 手动解决冲突
git status
git mergetool
git commit

# 问题3: 误删分支
# 解决: 从 reflog 恢复
git reflog
git checkout -b recovered-branch commit_hash

# 问题4: 发布分支有未合并的功能
# 解决: 将功能合并到 develop,然后重新创建发布分支
git checkout develop
git merge feature/late-feature
git branch -d release/1.0.0
git flow release start 1.0.0

分支状态检查

bash
#!/bin/bash
# Git Flow 状态检查脚本

echo "=== Git Flow 状态检查 ==="

# 检查当前分支
current_branch=$(git branch --show-current)
echo "当前分支: $current_branch"

# 检查主要分支是否存在
if git show-ref --verify --quiet refs/heads/main; then
    echo "✓ main 分支存在"
else
    echo "✗ main 分支不存在"
fi

if git show-ref --verify --quiet refs/heads/develop; then
    echo "✓ develop 分支存在"
else
    echo "✗ develop 分支不存在"
fi

# 检查活跃的功能分支
feature_branches=$(git branch | grep "feature/" | wc -l)
echo "活跃功能分支数: $feature_branches"

# 检查活跃的发布分支
release_branches=$(git branch | grep "release/" | wc -l)
echo "活跃发布分支数: $release_branches"

# 检查活跃的热修复分支
hotfix_branches=$(git branch | grep "hotfix/" | wc -l)
echo "活跃热修复分支数: $hotfix_branches"

# 检查未合并的分支
echo ""
echo "=== 未合并到 develop 的分支 ==="
git branch --no-merged develop | grep -v main

echo ""
echo "=== 未合并到 main 的分支 ==="
git branch --no-merged main | grep -v develop

总结

Git Flow 的核心要点:

分支结构

main/master     # 生产分支
develop         # 开发分支
feature/*       # 功能分支
release/*       # 发布分支
hotfix/*        # 热修复分支

工作流程

  • 🚀 功能开发:feature → develop
  • 📦 版本发布:develop → release → main + develop
  • 🔥 紧急修复:main → hotfix → main + develop

适用场景

  • ✅ 有计划的发布周期
  • ✅ 需要维护多个版本
  • ✅ 大型团队协作
  • ✅ 严格的质量控制

工具选择

  • git-flow 扩展:自动化操作
  • 手动实现:更好的控制
  • GUI 工具:可视化管理
  • CI/CD 集成:自动化部署

掌握 Git Flow 后,你就能够:

  • 📋 建立规范的开发流程
  • 🔄 支持并行功能开发
  • 🚀 管理稳定的发布周期
  • 🛠️ 快速响应紧急问题

在下一章中,我们将学习 Git 的撤销和恢复操作。

本站内容仅供学习和研究使用。