02 - 企业分支管理策略
本章目标:掌握企业中最常用的分支策略,能独立管理功能分支的完整生命周期。
一、为什么需要分支策略?
想象一个场景:
- 你正在开发新功能
- 线上突然出了 Bug 需要紧急修复
- 同事的代码还没 review 完
没有分支策略 :所有人的代码混在一起,互相影响,灾难现场。
有分支策略:各干各的,互不干扰,按规矩来。
二、企业常见的三种分支模型
模型一:Git Flow(适合有发版周期的项目)
main (master) ─────●─────────────────────●─────────●──────
│ ↑ ↑
│ merge merge
release/v1.0 ───────┼────────●───────●───┘ │
│ │ ↑ │
│ merge merge │
develop ───●───●────────●───────●──────────────●──────
│ │
feature/login ──●●──────●────┘
│ ↑
feature/pay ──●─────●┘
分支角色:
| 分支 | 用途 | 生命周期 |
|---|---|---|
main |
生产环境代码,只接受 release 合并 | 永久 |
develop |
开发集成分支 | 永久 |
feature/* |
功能开发 | 临时(完成后删除) |
release/* |
发版准备 | 临时 |
hotfix/* |
紧急修复 | 临时 |
模型二:GitHub Flow(适合持续交付的项目)--- 企业最常用
main ───●──────●──────●──────●──────●──────●──────
↑ ↑ ↑ ↑
merge merge merge merge
feature/login ──●──────●───────────┘ │
merge
feature/pay ─────────────────────────────●
规则极简:
main分支永远可部署- 所有改动通过 Pull Request 合并
- 合并后立即部署
模型三:Trunk-based(适合 DevOps 成熟的团队)
main ───●─────●─────●─────●─────●─────●─────
↑ ↑ ↑ ↑ ↑ ↑
各人直接往 main 提交(用短生命周期分支)
特点:
- 分支生命周期 < 1 天
- 依赖 Feature Flag 控制功能上线
- 对 CI/CD 要求极高
联通产业互联网大概率用 Git Flow 或 GitHub Flow。下面重点讲这两种。
三、Git Flow 完整操作手册
3.1 初始化
bash
# 安装 git-flow(Windows 需要额外安装)
# 或者手动操作(推荐,理解更深入)
# 确保 main 分支是干净的
git checkout main
git pull origin main
3.2 开发新功能
bash
# ===== 第一步:从 develop 创建 feature 分支 =====
git checkout develop
git pull origin develop
# 创建并切换到新分支
git checkout -b feature/user-login
# ===== 第二步:开发并提交 =====
# 你的代码修改...
git add .
git commit -m "feat(auth): add login page"
git commit -m "feat(auth): add login API"
# ===== 第三步:推送并创建 Merge Request =====
git push -u origin feature/user-login
# 在 GitLab 上创建 Merge Request
# 目标分支:develop
# 审核人:你的 leader
# ===== 第四步:review 通过后合并 =====
# 在 GitLab 点击 Merge(或者 leader 点击)
# ===== 第五步:删除远程分支 =====
git checkout develop
git pull origin develop
git branch -d feature/user-login
git push origin --delete feature/user-login
3.3 发版流程
bash
# ===== Release 分支 =====
git checkout develop
git checkout -b release/v1.2.0
# 发版前的最后调整(修 bug、改版本号等)
git commit -m "chore: bump version to 1.2.0"
# 合并到 main
git checkout main
git merge --no-ff release/v1.2.0
git tag -a v1.2.0 -m "Release v1.2.0"
git push origin main --tags
# 合并回 develop
git checkout develop
git merge --no-ff release/v1.2.0
# 清理
git branch -d release/v1.2.0
3.4 紧急修复(Hotfix)
bash
# ===== 线上出 Bug 了! =====
# 从 main 创建 hotfix 分支
git checkout main
git checkout -b hotfix/fix-payment-bug
# 修复代码
git add .
git commit -m "fix(payment): fix payment amount calculation"
# 合并到 main 并打 tag
git checkout main
git merge --no-ff hotfix/fix-payment-bug
git tag -a v1.2.1 -m "Hotfix v1.2.1"
git push origin main --tags
# 合并回 develop
git checkout develop
git merge --no-ff hotfix/fix-payment-bug
# 清理
git branch -d hotfix/fix-payment-bug
四、分支命名规范(企业必须遵守)
feature/user-login ← 功能分支
feature/JIRA-123-add-cart ← 带 Jira 编号的功能分支
bugfix/fix-login-error ← Bug 修复
hotfix/fix-payment-crash ← 紧急修复
release/v1.2.0 ← 发版分支
chore/update-dependencies ← 杂项维护
docs/api-documentation ← 文档
test/unit-test-login ← 测试
命名规则:
- 全小写,用
-连接 - 必须带类型前缀(
feature/、bugfix/等) - 关联 Jira/Issue 编号(如
feature/JIRA-123-add-cart) - 简短但有描述性
五、合并方式选择
5.1 merge(保留历史)
bash
git checkout develop
git merge --no-ff feature/user-login
* merge commit
|\
| * feature commit 2
| * feature commit 1
|/
* develop commit
优点 :保留完整的分支历史
缺点:历史线会比较乱
5.2 rebase(线性历史)--- 企业推荐
bash
# 在 feature 分支上操作
git checkout feature/user-login
# 把 develop 的最新代码变基到你的分支上
git fetch origin
git rebase origin/develop
# 如果有冲突,解决后继续
git rebase --continue
# 推送(需要 force push,因为历史被重写了)
git push --force-with-lease
* feature commit 2
* feature commit 1
* develop commit 2
* develop commit 1
优点 :历史干净线性
缺点:需要 force push
5.3 企业选择建议
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 小团队、功能简单 | merge --no-ff | 简单直观 |
| 大团队、频繁集成 | rebase | 历史干净,易追踪 |
| 公共分支(main/develop) | merge | 保护历史 |
| 个人 feature 分支 | rebase | 保持同步 |
六、分支操作速查表
bash
# ===== 查看分支 =====
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
git branch -v # 查看各分支最后一次提交
# ===== 创建分支 =====
git branch feature/new-api # 创建但不切换
git checkout -b feature/new-api # 创建并切换
git switch -c feature/new-api # 新语法(推荐)
# ===== 切换分支 =====
git checkout feature/new-api # 旧语法
git switch feature/new-api # 新语法(推荐)
# ===== 删除分支 =====
git branch -d feature/old-branch # 删除已合并的分支
git branch -D feature/old-branch # 强制删除(未合并)
git push origin --delete feature/old-branch # 删除远程分支
# ===== 重命名分支 =====
git branch -m old-name new-name
git push origin old-name:new-name
git push origin --delete old-name
# ===== 查看分支图 =====
git log --oneline --graph --all --decorate
# 或用你配置的别名
git lg
七、实战:从零开始一个功能的完整流程
假设你要开发"用户登录"功能,项目用 GitHub Flow。
bash
# ===== 1. 同步最新代码 =====
git checkout main
git pull origin main
# ===== 2. 创建功能分支 =====
git checkout -b feature/user-login
# ===== 3. 开发(多次 commit) =====
# 修改 login.html...
git add login.html
git commit -m "feat(auth): create login page layout"
# 修改 login.js...
git add login.js
git commit -m "feat(auth): implement login validation"
# 修改 login.css...
git add login.css
git commit -m "style(auth): add login page styles"
# ===== 4. 同步最新代码(开发期间 develop 有更新) =====
git fetch origin
git rebase origin/main
# 如果有冲突:
# 1. 编辑冲突文件
# 2. git add <冲突文件>
# 3. git rebase --continue
# ===== 5. 推送到远程 =====
git push -u origin feature/user-login
# ===== 6. 在 GitLab/GitHub 创建 Pull Request =====
# - 标题:feat(auth): implement user login
# - 描述:实现用户登录功能,包括表单验证和 API 调用
# - 审核人:@leader
# ===== 7. Code Review 通过后合并 =====
# 在平台上点击 Merge
# ===== 8. 清理 =====
git checkout main
git pull origin main
git branch -d feature/user-login
八、常见错误与解决方案
错误1:在 main 分支上开发了
bash
# 解决:把改动移到新分支
git checkout -b feature/my-work # 在当前位置创建新分支
git checkout main # 回到 main
git reset --hard origin/main # 重置 main 到远程状态
错误2:提交了不该提交的文件
bash
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1
# 撤销暂存(取消 git add)
git reset HEAD <file>
错误3:合并了冲突不知道怎么办
bash
# 查看冲突文件
git status
# 冲突标记解释:
<<<<<<< HEAD
你当前分支的代码
=======
别人提交的代码
>>>>>>> feature/xxx
# 解决步骤:
# 1. 手动编辑文件,选择保留哪部分(或都保留)
# 2. 删除冲突标记(<<<<<<< ======= >>>>>>>)
# 3. git add <文件>
# 4. git commit(merge 时)或 git rebase --continue(rebase 时)
九、练习清单
学完本章,请完成以下操作:
- 创建一个练习仓库,手动走完 Git Flow 的 feature → develop → main 流程
- 练习 rebase 操作,把一个落后于 main 的 feature 分支变基到最新
- 制造一次合并冲突并解决它
- 用
git log --oneline --graph --all画出分支图 - 练习删除分支(本地+远程)
- 按命名规范创建 3 个不同类型的分支
上一章 :01-Git核心概念与企业环境配置
下一章 :03-Git工作流实战