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-authentication2. 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.03. 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.1Git Flow 工具安装
安装 git-flow 扩展
macOS
bash
# 使用 Homebrew
brew install git-flow-avh
# 使用 MacPorts
sudo port install git-flowUbuntu/Debian
bash
sudo apt-get install git-flowWindows
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-loginRelease 分支操作
开始新发布
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.0Hotfix 分支操作
开始热修复
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.1Git 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-fix2. 提交信息规范
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-featureGit 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 到 mainMicrosoft 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 的撤销和恢复操作。