Skip to content

分支管理

本章定义 Git 分支的管理策略,包括分支模型选择、命名规范、保护规则等。

分支模型

模型选择策略

根据项目类型选择合适的分支模型:

项目类型推荐模型分支结构发布方式
Web 应用GitHub Flowmain + feature持续部署
微服务GitHub Flowmain + feature持续部署
SDK/库Git Flowmain + develop + feature/release/hotfix版本发布
移动应用Git Flowmain + develop + feature/release/hotfix商店发布

GitHub Flow

适用于持续部署的项目:

mermaid
gitGraph
  commit
  branch feature/login
  checkout feature/login
  commit
  commit
  checkout main
  merge feature/login
  commit

工作流程

  1. 从 main 创建功能分支
  2. 在功能分支上开发
  3. 创建 Pull Request
  4. 代码审查和测试
  5. 合并到 main
  6. 自动部署

Git Flow

适用于需要版本管理的项目:

mermaid
gitGraph
  commit tag: "v1.0.0"
  branch develop
  checkout develop
  commit
  branch feature/auth
  checkout feature/auth
  commit
  commit
  checkout develop
  merge feature/auth
  branch release/1.1.0
  checkout release/1.1.0
  commit
  checkout main
  merge release/1.1.0
  commit tag: "v1.1.0"
  checkout develop
  merge release/1.1.0

工作流程

  1. 日常开发在 develop 分支
  2. 功能开发创建 feature 分支
  3. 发布准备创建 release 分支
  4. 发布后合并到 main 和 develop
  5. 紧急修复使用 hotfix 分支

分支命名规范

命名格式

<type>/<ticket>-<description>
  • type: 分支类型
  • ticket: 关联的任务票号(如 JIRA)
  • description: 简短描述(kebab-case)

分支类型

类型用途示例
feature新功能开发feature/JIRA-123-user-auth
fix问题修复fix/JIRA-456-login-error
hotfix紧急修复hotfix/JIRA-789-security-patch
release版本发布release/1.2.0
chore杂项任务chore/JIRA-321-update-deps

命名规则

yaml
# 正确示例 ✅
feature/PROJ-123-add-payment
fix/PROJ-456-resolve-memory-leak
hotfix/PROJ-789-patch-security
release/2.1.0
chore/PROJ-111-upgrade-deps

# 错误示例 ❌
feature-user-login          # 缺少票号
PROJ-123                     # 缺少类型
add_payment                  # 使用下划线
Feature/PROJ-123-payment    # 类型大写

分支保护规则

主分支保护

main/master 分支必须启用以下保护:

yaml
# GitHub 分支保护设置
protection_rules:
  main:
    # 基础保护
    require_pull_request: true
    required_approving_reviews: 1
    dismiss_stale_reviews: true
    require_code_owner_reviews: false
    
    # 合并前检查
    require_status_checks: true
    required_status_checks:
      - continuous-integration/travis-ci
      - lint
      - test
      - build
    
    # 其他限制
    restrict_push_access: false
    allow_force_pushes: false
    allow_deletions: false
    require_linear_history: false
    require_conversation_resolution: true

develop 分支保护

对于使用 Git Flow 的项目:

yaml
protection_rules:
  develop:
    require_pull_request: true
    required_approving_reviews: 1
    require_status_checks: true
    required_status_checks:
      - lint
      - test
    allow_force_pushes: false

分支生命周期

创建时机

  • feature: Sprint 开始或任务分配时
  • fix: 问题确认后
  • hotfix: 生产事故发生时
  • release: 版本功能完成后

合并策略

根据 PR 类型选择合并方式:

PR 类型合并策略说明
小功能(<5 commits)Squash and merge压缩为一个提交
大功能(≥5 commits)Rebase and merge保留提交历史
紧急修复Create a merge commit保留完整上下文
依赖更新Squash and merge简化历史

清理策略

bash
# 自动删除(推荐)
- PR 合并后自动删除源分支
- GitHub/GitLab 仓库设置中启用

# 手动清理本地分支
git branch -d feature/completed-feature
git remote prune origin

# 批量清理已合并分支
git branch --merged | grep -v "main\|develop" | xargs -n 1 git branch -d

分支操作规范

创建分支

bash
# 1. 确保本地 main 最新
git checkout main
git pull origin main

# 2. 创建并切换到新分支
git checkout -b feature/JIRA-123-new-feature

# 3. 推送到远程
git push -u origin feature/JIRA-123-new-feature

更新分支

bash
# 推荐:使用 rebase 保持线性历史
git checkout feature/my-feature
git fetch origin
git rebase origin/main

# 处理冲突后
git rebase --continue

# 强制推送到个人分支
git push --force-with-lease origin feature/my-feature

合并分支

bash
# 通过 PR/MR 合并(推荐)
# 1. 推送分支
git push origin feature/my-feature

# 2. 在平台上创建 PR
# 3. 等待审查和 CI
# 4. 合并后自动删除远程分支

# 本地清理
git checkout main
git pull origin main
git branch -d feature/my-feature

特殊场景处理

长期功能分支

对于开发周期超过 2 周的功能:

bash
# 定期同步主分支
git checkout feature/long-term
git rebase origin/main  # 每周至少一次

# 考虑拆分为多个小 PR
# 使用功能开关(feature flags)逐步上线

实验性分支

bash
# 使用明确的前缀
experimental/new-architecture
poc/new-framework

# 设置过期时间
# 在 README 中标注实验目的和截止日期

紧急修复流程

bash
# Git Flow 项目
git checkout -b hotfix/JIRA-999-critical-fix main
# 修复后合并到 main 和 develop

# GitHub Flow 项目
git checkout -b fix/JIRA-999-critical-fix main
# 直接 PR 到 main,标记为紧急

权限管理

强制推送权限

yaml
force_push_rules:
  # 仅允许推送到个人分支
  allowed_patterns:
    - "feature/*"
    - "fix/*"
    - "chore/*"
  
  # 禁止推送到公共分支
  protected_patterns:
    - "main"
    - "master" 
    - "develop"
    - "release/*"
    - "hotfix/*"

分支创建权限

yaml
branch_creation_rules:
  # 开发者可创建
  developer_can_create:
    - "feature/*"
    - "fix/*"
    - "chore/*"
  
  # 需要更高权限
  maintainer_required:
    - "release/*"
    - "hotfix/*"

常见问题

分支命名冲突?

bash
# 使用更具体的描述
feature/JIRA-123-user-auth-oauth2  # 而不是 feature/JIRA-123-auth

# 或添加用户前缀(临时方案)
feature/JIRA-123-john-user-auth

忘记从最新 main 创建分支?

bash
# 使用 rebase 更新基点
git rebase --onto main old-base feature/my-feature

# 或者重新创建(如果还没有太多提交)
git checkout main
git pull
git checkout -b feature/new-branch
git cherry-pick <commits>

分支偏离太远?

bash
# 定期 rebase(推荐)
git rebase origin/main

# 如果冲突太多,考虑:
# 1. 拆分为更小的 PR
# 2. 与团队协调合并顺序
# 3. 使用 merge 而不是 rebase(最后选择)

最佳实践

DO ✅

  • 保持分支短生命周期(理想 < 1 周)
  • 频繁同步主分支的更新
  • 使用描述性的分支名称
  • 删除已合并的分支
  • 遵循项目选定的分支模型

DON'T ❌

  • 不要在公共分支上 rebase
  • 避免长期存在的功能分支
  • 不要直接在 main 上开发
  • 避免使用通用名称(如 dev、test)
  • 不要强制推送到公共分支

下一步

掌握分支管理后,请参考:

基于 MIT 许可发布