Git Flow 与 GitHub Flow

3 min中级

Git Flow与GitHub Flow分支模型对比:工作流程、适用场景与最佳实践。

1. 分支模型概述

1.1 为什么需要分支模型

分支模型定义了团队如何使用分支进行协作,核心解决:

  • 如何组织功能开发
  • 如何管理发布
  • 如何处理热修复
  • 如何保持主分支稳定

2. Git Flow

2.1 分支结构

flowchart LR
    M[main] --> R[release/1.0]
    D[develop] --> F1[feature/A]
    D --> F2[feature/B]
    F1 --> D
    F2 --> D
    R --> M
    R --> D
分支命名生命周期用途
mainmain永久生产版本
developdevelop永久开发集成分支
featurefeature/*临时功能开发
releaserelease/*临时发布准备
hotfixhotfix/*临时紧急修复

2.2 工作流程

# 1. 从 develop 创建功能分支
git checkout -b feature/auth develop

# 2. 开发并提交
git commit -m "feat: add login"

# 3. 完成后合并回 develop
git checkout develop
git merge --no-ff feature/auth
git branch -d feature/auth

# 4. 准备发布
git checkout -b release/1.0 develop
# 修复 Bug、更新版本号
git commit -m "chore: bump version to 1.0"

# 5. 合并到 main 和 develop
git checkout main
git merge --no-ff release/1.0
git tag -a v1.0.0
git checkout develop
git merge --no-ff release/1.0
git branch -d release/1.0

# 6. 热修复
git checkout -b hotfix/bug-123 main
git commit -m "fix: resolve critical bug"
git checkout main
git merge --no-ff hotfix/bug-123
git tag -a v1.0.1
git checkout develop
git merge --no-ff hotfix/bug-123
git branch -d hotfix/bug-123

2.3 Git Flow 工具

# 安装 git-flow
brew install git-flow        # macOS
sudo apt install git-flow    # Linux

# 初始化
git flow init

# 功能开发
git flow feature start auth
git flow feature finish auth

# 发布
git flow release start 1.0
git flow release finish 1.0

# 热修复
git flow hotfix start bug-123
git flow hotfix finish bug-123

3. GitHub Flow

3.1 分支结构

flowchart LR
    M[main] --> F1[feature/A]
    M --> F2[feature/B]
    F1 --> M
    F2 --> M
分支命名生命周期用途
mainmain永久始终可部署
featurefeature/*临时所有开发工作

3.2 工作流程

# 1. 从 main 创建分支
git checkout -b feature/auth main

# 2. 开发并提交
git commit -m "feat: add authentication"

# 3. 推送并创建 Pull Request
git push -u origin feature/auth
# 在 GitHub 上创建 PR

# 4. 代码审查
# 团队成员审查代码

# 5. 合并到 main
# 通过 GitHub 合并 PR
# 自动部署到生产环境

# 6. 删除分支
git branch -d feature/auth
git push origin --delete feature/auth

3.3 核心原则

  • main 分支始终可部署
  • 所有开发在功能分支进行
  • 通过 Pull Request 进行代码审查
  • 合并后立即部署

4. 模型对比

特性Git FlowGitHub Flow
复杂度高低
分支数量5种2种
发布节奏计划发布持续部署
适用团队大团队、版本化产品小团队、Web 应用
学习成本较高较低
热修复专用 hotfix 分支从 main 创建分支
版本管理明确的版本标签持续交付

5. 其他模型

5.1 Trunk-Based Development

flowchart LR
    M[main<br/>频繁提交,小步前进<br/>功能开关控制未完成功能]
  • 所有开发者在 main 上直接提交
  • 使用功能开关(Feature Flag)控制
  • 极短的分支生命周期(<1天)
  • 适合 CI/CD 成熟的团队

5.2 选型建议

场景推荐模型
Web/SaaS 应用GitHub Flow
移动应用Git Flow
开源项目GitHub Flow
嵌入式/固件Git Flow
微服务GitHub Flow / Trunk-Based
大型团队Git Flow
初创团队GitHub Flow

分支模型

基本写法:主分支 main main

# 仅存放稳定的发布版本
# 每次合并都打标签

基本写法:开发分支 develop develop

# 日常集成分支,反映最新开发状态
# feature 分支从此切出

基本写法:功能分支 feature feature/<功能名>

# 单个功能开发分支
# 完成后合并回 develop

基本写法:发布分支 release release/<版本号>

# 准备发布版本,仅修复 bug
# 完成后合并到 main 与 develop

基本写法:热修分支 hotfix hotfix/<编号>

# 基于 main 修复线上问题
# 完成后合并到 main 与 develop

git-flow 工具

基本写法:安装 git-flow apt-get install git-flow

# Debian/Ubuntu 安装 git-flow 扩展
apt-get install git-flow

基本写法:初始化 git-flow git flow init

# 交互式配置各分支命名
git flow init

基本写法:非交互式初始化 git flow init -d

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

feature 工作流

基本写法:开始新功能 git flow feature start <功能名>

# 从 develop 切出新功能分支
git flow feature start login

基本写法:发布功能到远程 git flow feature publish <功能名>

# 将功能分支推送到远程协作
git flow feature publish login

基本写法:拉取远程功能分支 git flow feature track <功能名>

# 跟踪远程已有的功能分支
git flow feature track login

基本写法:完成功能 git flow feature finish <功能名>

# 合并功能分支到 develop 并删除
git flow feature finish login

基本写法:完成功能保留分支 git flow feature finish -k <功能名>

# 合并后保留功能分支
git flow feature finish -k login

release 工作流

基本写法:开始发布分支 git flow release start <版本号>

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

基本写法:发布分支推到远程 git flow release publish <版本号>

# 推送发布分支供团队协作
git flow release publish 1.2.0

基本写法:完成发布 git flow release finish <版本号>

# 合并到 main 与 develop 并打标签
git flow release finish 1.2.0

基本写法:完成发布带推送 git flow release finish -p <版本号>

# 完成后自动推送 main、develop 与标签
git flow release finish -p 1.2.0

基本写法:完成发布带信息 git flow release finish -m "<消息>" <版本号>

# 为合并提交与标签添加信息
git flow release finish -m "release 1.2.0" 1.2.0

hotfix 工作流

基本写法:开始热修 git flow hotfix start <版本号> [<基线>]

# 基于 main 创建热修分支
git flow hotfix start 1.2.1

基本写法:完成热修 git flow hotfix finish <版本号>

# 合并到 main 与 develop 并打标签
git flow hotfix finish 1.2.1

基本写法:完成热修带推送 git flow hotfix finish -p <版本号>

# 完成后推送所有相关分支与标签
git flow hotfix finish -p 1.2.1

手动实现 Git Flow

基本写法:手动创建 feature 分支 git checkout -b feature/<功能名> develop

# 从 develop 创建功能分支
git checkout -b feature/login develop

基本写法:完成 feature 合并 git checkout develop && git merge --no-ff feature/<功能名>

# 用 --no-ff 保留合并记录
git checkout develop && git merge --no-ff feature/login

基本写法:手动创建 release 分支 git checkout -b release/<版本号> develop

# 从 develop 创建发布分支
git checkout -b release/1.2.0 develop

基本写法:完成 release 合并到 main git checkout main && git merge --no-ff release/<版本号>

# 发布分支合并到 main
git checkout main && git merge --no-ff release/1.2.0

基本写法:打版本标签 git tag -a <版本号> -m "<消息>"

# 在 main 上打带注释标签
git tag -a v1.2.0 -m "Release 1.2.0"

基本写法:release 合并回 develop git checkout develop && git merge --no-ff release/<版本号>

# 发布内容同步回 develop
git checkout develop && git merge --no-ff release/1.2.0

基本写法:删除已合并分支 git branch -d <分支名>

# 删除已合并的功能分支
git branch -d feature/login

GitHub Flow 简化流程

基本写法:从 main 切分支 git checkout -b <分支名> main

# 简化流程仅使用 main 与功能分支
git checkout -b feature/login main

基本写法:推送并创建 PR git push -u origin <分支名>

# 推送后通过 Pull Request 合并
git push -u origin feature/login

基本写法:合并后删除分支 git branch -d <分支名> && git push origin --delete <分支名>

# 本地与远程同时删除分支
git branch -d feature/login && git push origin --delete feature/login

版本号管理

基本写法:语义化版本号格式 <主版本>.<次版本>.<修订号>

# 例如 1.2.3 表示主版本 1 次版本 2 修订 3

基本写法:发布标签命名规范 v<版本号>

# 标签前加 v 表示版本
git tag -a v1.2.0 -m "Release 1.2.0"

与 CI/CD 协同

基本写法:基于标签触发部署 git push origin --tags

# 推送标签触发发布流水线
git push origin --tags

基本写法:仅 main 触发生产部署 git push origin main

# 主分支推送触发生产环境部署
git push origin main

基本写法:develop 触发测试部署 git push origin develop

# 开发分支推送触发测试环境部署
git push origin develop