Git_03_GitFlow分支工作流

【GitFlow】分支工作流:五种分支模型的完整协作流程

🔑 关键词:GitFlow、分支模型、feature/release/hotfix、团队协作、版本发布


一、什么是 GitFlow?

GitFlow 是 Vincent Driessen 提出的一套 Git 分支管理模型,定义了清晰的分支策略和合并流程,适用于有明确版本发布周期的项目。

📌 一句话理解:GitFlow 告诉你团队里每种分支该怎么建、怎么合并、什么时候用,避免分支管理混乱。


二、五种分支

分支 类型 生命周期 用途
main 永久 永久存在 生产环境代码,每个 tag 对应一个发布版本
develop 永久 永久存在 开发主线,包含下一个版本的最新代码
feature/* 临时 开发期间 新功能开发,从 develop 创建,完成后合并回 develop
release/* 临时 发布准备 发布前的测试和修复,从 develop 创建,合并到 main 和 develop
hotfix/* 临时 紧急修复 生产环境紧急修复,从 main 创建,合并到 main 和 develop

三、分支关系图

复制代码
main:     ──●──────────────────●──────────●──
             \                /            /
              \              /            /
develop:   ────●──●──●──●──●──●──●──●──●────
                   /          /      \
feature/A:       ●──●──●──●          \
                                      \
feature/B:        ●──●──●──●──●        \
                                      \
release/1.0:            ●──●──●──●     \
                                          \
hotfix/1.0.1:                               ●──●

四、完整工作流程

4.1 开发新功能(Feature)

bash 复制代码
# 1. 从 develop 创建 feature 分支
git checkout develop
git checkout -b feature/animal-crud

# 2. 开发功能
git add .
git commit -m "feat: 新增动物CRUD接口"
git commit -m "feat: 新增动物分页查询"

# 3. 推送到远程
git push origin feature/animal-crud

# 4. 在 GitLab 创建 MR → develop
# 5. 代码审查通过后合并

Feature 分支命名规范:

复制代码
feature/animal-crud        # 动物管理CRUD
feature/user-login         # 用户登录
feature/123-add-search     # 关联 Issue #123

4.2 发布版本(Release)

bash 复制代码
# 1. 从 develop 创建 release 分支
git checkout develop
git checkout -b release/1.0.0

# 2. 只做 Bug 修复,不加新功能
git commit -m "fix: 修复分页查询边界问题"

# 3. 测试通过后,合并到 main
git checkout main
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "版本1.0.0发布"

# 4. 同时合并回 develop(同步修复内容)
git checkout develop
git merge --no-ff release/1.0.0

# 5. 删除 release 分支
git branch -d release/1.0.0

4.3 紧急修复(Hotfix)

bash 复制代码
# 1. 从 main 创建 hotfix 分支
git checkout main
git checkout -b hotfix/1.0.1

# 2. 修复 Bug
git commit -m "fix: 修复登录Token过期异常"

# 3. 合并到 main 并打标签
git checkout main
git merge --no-ff hotfix/1.0.1
git tag -a v1.0.1 -m "紧急修复Token问题"

# 4. 同时合并回 develop
git checkout develop
git merge --no-ff hotfix/1.0.1

# 5. 删除 hotfix 分支
git branch -d hotfix/1.0.1

五、关键规则

5.1 合并方向

分支 从哪来 合并到哪
feature/* develop → develop
release/* develop → main + develop
hotfix/* main → main + develop

5.2 合并方式

所有合并都使用 --no-ff(强制创建合并提交),保留完整的分支历史。

bash 复制代码
# 为什么不用快进合并?
# 快进合并后,分支信息丢失,无法追溯"这些提交属于哪个功能"
# --no-ff 保留合并节点,一看历史就知道哪个功能是哪次合入的

5.3 分支命名约定

复制代码
feature/xxx     新功能
bugfix/xxx      非紧急Bug修复(合并到develop)
release/x.y.z   版本发布
hotfix/x.y.z    紧急修复

六、团队协作场景

6.1 日常开发流程

复制代码
早上上班:
1. git checkout develop
2. git pull origin develop        ← 拉取最新代码
3. git checkout -b feature/xxx    ← 创建今日功能分支

开发中:
4. 编码 → git add → git commit(多次小提交)
5. git push origin feature/xxx

下班前:
6. 在 GitLab 创建 MR → develop
7. 指定同事 Review
8. Review 通过后合并

6.2 多人协作同一功能

bash 复制代码
# 开发者A创建功能分支
git checkout -b feature/payment origin/develop

# 开发者B也需要参与
git checkout -b feature/payment origin/feature/payment

# 各自开发,定期同步
git pull origin feature/payment   # 拉取对方代码

6.3 版本发布检查清单

复制代码
□ develop 分支所有功能测试通过
□ 创建 release 分支
□ 更新版本号(pom.xml / package.json)
□ 更新 CHANGELOG.md
□ QA 测试 release 分支
□ 修复测试中发现的 Bug
□ 合并 release → main
□ 打 Tag
□ 合并 release → develop
□ 部署 main 到生产环境
□ 通知团队发布完成

七、GitFlow vs GitHub Flow

对比 GitFlow GitHub Flow
分支数量 5 种 只有 main + feature
复杂度 高 简单
发布方式 定期版本发布 随时部署
适用场景 有版本周期的项目 持续部署的 Web 应用
develop 分支 有 没有
release 分支 有 没有

GitHub Flow 流程:

复制代码
1. 从 main 创建 feature 分支
2. 开发完成后创建 Pull Request
3. 审查通过后合并到 main
4. 立即部署到生产环境

💡 选择建议:移动端 App、有明确版本计划的项目用 GitFlow;Web 服务、持续部署的项目用 GitHub Flow。


八、常见问题

Q1:feature 分支开发太久,合并时冲突很多怎么办?

答 :定期将 develop 合并到 feature 分支(git merge develop),及时同步主分支的变更,减少最终合并时的冲突量。

Q2:hotfix 修复完忘记合并回 develop 会怎样?

答:下次发布新版本时,develop 中没有这个修复,会导致 Bug 再次出现。所以 hotfix 必须同时合并到 main 和 develop。

Q3:GitFlow 太复杂,小团队适合用吗?

答:3-5 人小团队可以简化 GitFlow:只保留 main + develop + feature,release 阶段直接在 develop 上测试修复,跳过 release 分支。hotfix 保留。


九、面试高频问题

Q1:GitFlow 的五种分支分别是什么?

答 :main(生产代码)、develop(开发主线)、feature/*(新功能)、release/*(发布准备)、hotfix/*(紧急修复)。其中 main 和 develop 是永久分支,其他三种是临时分支。

Q2:release 分支的作用?

答:从 develop 分出,用于发布前的测试和 Bug 修复。在 release 分支上只修 Bug 不加新功能。测试通过后合并到 main(打 Tag)和 develop(同步修复)。

Q3:为什么合并要用 --no-ff?

答 :--no-ff 强制创建合并提交,即使可以快进合并。好处是保留分支的合并记录,从历史中可以清晰看出"哪些提交属于哪个功能",便于追溯和回滚。


十、总结

场景 操作流程
新功能 develop → feature/* → MR → develop
版本发布 develop → release/* → main(Tag)+ develop
紧急修复 main → hotfix/* → main(Tag)+ develop
日常同步 定期 git merge develop 到 feature 分支
分支保护 main 和 develop 禁止直接 push
相关推荐
Flynt1 小时前
把 bug tracker 塞进 git 仓库,同步和冲突怎么解决?我把 git-bug 拆开实测了一遍
分布式·git·开源
louisgeek1 天前
Git submodule 子模块
git
imDwAaY1 天前
6篇文章讲清楚Git:Git 实用技巧:暂存现场、挑选提交与定位 Bug (5/6)
git·后端
imDwAaY1 天前
6篇文章讲清楚Git:Git 团队开发实践:从 Pull Request 到版本发布 (6/6)
git·后端
誰能久伴不乏1 天前
看懂 Git 团队协作全流程:分支、提交、PR、rebase 到底在干嘛
git
sunshine22 girl2 天前
git tag-项目流程
git
imDwAaY2 天前
6篇文章讲清楚Git:Git 远程协作:fetch、pull、push 到底有什么区别?(3/6)
git·后端
imDwAaY2 天前
6篇文章讲清楚Git:Git 撤销与恢复:reset、revert、restore 应该怎么选?(4/6)
git
用户73309646123092 天前
再也不怕手滑丢代码!给 git 高危操作加一层安全校验
git