【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 |