Git Flow 工作流详解与实践指南

本指南旨在详细介绍由 Vincent Driessen 提出的、业界广泛采用的 Git 分支管理模型——Git Flow。内容从其核心概念和分支职责入手,通过流程图和简化的手动命令进行实践,并最终介绍如何使用 git-flow 工具链实现自动化。

1. 核心概念:分支的职责划分

Git Flow 的精髓在于为不同类型的开发活动定义了专门的、有明确生命周期的分支,主要分为两类主分支和三类辅助分支。

1.1 两条主分支 (Long-lived)

master (或 main): 生产分支

  • 永远处于可发布状态,其上的每一个 commit 都应对应一个正式的发布版本,并使用版本号 tag 标记。
  • 绝对禁止直接在该分支上进行开发。

develop: 主开发分支

  • 作为所有新功能开发的集成分支,包含了所有已完成、待发布的功能。
  • 它是新功能分支的起点,也是新功能合并的终点。

1.2 三类辅助分支 (Short-lived)

feature/*: 功能分支

  • 用于开发新的、非紧急的功能。
  • 起点: 从 develop 分支切出。
  • 终点: 开发完成后,合并回 develop 分支。
  • 命名: 建议 feature/user-login, feature/shopping-cart

release/*: 发布分支

  • 用于准备一次新的正式发布。在此分支上,只进行 Bug 修复、文档生成等与发布相关的任务。
  • 起点: 从 develop 分支切出。
  • 终点: 发布完成后,必须同时合并回 masterdevelop 分支,并在 master 上打上版本标签。

hotfix/*: 热修复分支

  • 用于紧急修复线上 master 分支出现的 Bug。
  • 起点: 从 master 分支切出。
  • 终点: 修复完成后,必须同时合并回 masterdevelop 分支,并在 master 上打上修复后的版本标签。

2. Git Flow 流程图

以下是 Git Flow 工作模式的流程图,您可以在支持 Mermaid 语法的 Markdown 编辑器中查看。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
participant master
participant develop
participant feature
participant release
participant hotfix

master->>develop: 初始化, 创建 develop 分支
develop->>feature: 切出功能分支 (e.g., feature/login)
feature-->>feature: 开发新功能...
feature->>develop: 功能完成, 合并回 develop
    
develop->>release: 准备发布, 切出 release 分支 (e.g., release/v1.0)
release-->>release: Bug 修复, 版本号更新...
    
release->>master: 发布完成, 合并到 master
master->>master: (Tag: v1.0)
release->>develop: 同时合并回 develop
    
master->>hotfix: 线上出现紧急 Bug, 切出 hotfix 分支 (e.g., hotfix/v1.0.1)
hotfix-->>hotfix: 紧急修复...
    
hotfix->>master: 修复完成, 合并到 master
master->>master: (Tag: v1.0.1)
hotfix->>develop: 同时合并回 develop

3. 手动实践 Git Flow (单仓库)

以下是在一个仓库内,通过基础 Git 命令模拟 Git Flow 流程。

3.1 初始设置

1
2
3
4
5
6
7
8
9
# 初始化项目并首次提交
git init
echo "Initial Project" > README.md
git add .
git commit -m "Initial commit"
git tag v0.1

# 创建 develop 分支
git branch develop

3.2 开发新功能 (Feature)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 1. 从 develop 切出功能分支
git checkout -b feature/user-auth develop

# 2. 在功能分支上进行开发...
echo "User login logic" > login.php
git add .
git commit -m "feat: Add user login feature"

# 3. 开发完成,合并回 develop 分支
git checkout develop
git merge --no-ff feature/user-auth
# --no-ff (no fast-forward) 会创建一个新的合并 commit,保留分支历史

# 4. 删除已合并的功能分支
git branch -d feature/user-auth

3.3 准备发布 (Release)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 1. 从 develop 切出发布分支
git checkout -b release/v1.0 develop

# 2. 在发布分支上进行最后的 Bug 修复和版本准备...
# (例如修改版本号文件,修复小 Bug)

# 3. 发布完成,将 release 分支合并到 master 和 develop
git checkout master
git merge --no-ff release/v1.0
git tag -a v1.0 -m "Release version 1.0"

git checkout develop
git merge --no-ff release/v1.0

# 4. 删除已合并的发布分支
git branch -d release/v1.0

3.4 紧急热修复 (Hotfix)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 1. 线上 master 版本发现紧急 Bug,从 master 切出 hotfix 分支
git checkout -b hotfix/v1.0.1 master

# 2. 在 hotfix 分支上修复 Bug...
echo "Critical security patch" >> patch.php
git add .
git commit -m "fix: Address critical security issue"

# 3. 修复完成,将 hotfix 分支合并到 master 和 develop
git checkout master
git merge --no-ff hotfix/v1.0.1
git tag -a v1.0.1 -m "Hotfix for version 1.0.1"

git checkout develop
git merge --no-ff hotfix/v1.0.1

# 4. 删除已合并的热修复分支
git branch -d hotfix/v1.0.1

4. 使用 git-flow 自动化工具 (推荐)

手动执行上述流程容易出错,社区为此提供了 git-flow 命令行扩展工具,可以极大地简化操作。

4.1 安装

1
2
3
4
5
# RHEL/CentOS
yum install git-flow

# Debian/Ubuntu
apt install git-flow

4.2 使用流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 初始化 (会在仓库中配置好 master 和 develop 分支)
git flow init

# 开始一个新功能
git flow feature start user-profile

# ... 在 feature/user-profile 分支上开发 ...

# 完成一个功能 (会自动合并回 develop 并删除 feature 分支)
git flow feature finish user-profile

# 开始一个发布
git flow release start v1.1

# ... 在 release/v1.1 分支上进行发布准备 ...

# 完成一个发布 (会自动合并到 master 和 develop,打标签,并删除 release 分支)
git flow release finish v1.1

git flow hotfix 的用法与此类似。使用此工具可以安全、规范地执行 Git Flow 模型。