Skip to content

Git 分支管理

分支概述

Git 的分支模型是其最强大的特性之一。分支允许你在不影响主线开发的情况下,独立地进行开发工作。

分支的优势

  • 并行开发:多个功能可以同时开发
  • 隔离环境:每个分支都是独立的工作环境
  • 安全性:在分支上实验,不影响主分支
  • 灵活性:可以随时创建、切换、合并分支

分支的基本操作

创建分支

bash
# 创建新分支
git branch <branch-name>

# 基于指定提交创建分支
git branch <branch-name> <commit>

# 基于指定标签创建分支
git branch <branch-name> <tag>

切换分支

bash
# 切换到已存在的分支
git checkout <branch-name>

# 创建并切换到新分支
git checkout -b <branch-name>

# 创建并切换到基于指定提交的分支
git checkout -b <branch-name> <commit>

查看分支

bash
# 查看本地分支
git branch

# 查看所有分支(包括远程分支)
git branch -a

# 查看远程分支
git branch -r

# 查看分支的最后一次提交
git branch -v

# 查看分支的详细信息
git branch -vv

删除分支

bash
# 删除已合并的分支
git branch -d <branch-name>

# 强制删除分支(即使未合并)
git branch -D <branch-name>

# 删除远程分支
git push <remote> --delete <branch-name>

重命名分支

bash
# 重命名当前分支
git branch -m <new-name>

# 重命名指定分支
git branch -m <old-name> <new-name>

分支合并

Merge 合并

bash
# 合并指定分支到当前分支
git merge <branch-name>

# 合并但不自动提交
git merge --no-commit <branch-name>

# 合并并创建合并提交
git merge --no-ff <branch-name>

# 终止合并
git merge --abort

Merge 的特点

  • 保留完整的历史记录
  • 创建合并提交
  • 历史记录呈分叉状
  • 适合需要保留完整历史的场景

Rebase 变基

bash
# 将当前分支变基到指定分支
git rebase <branch-name>

# 交互式变基
git rebase -i <commit>

# 继续变基
git rebase --continue

# 跳过当前提交
git rebase --skip

# 终止变基
git rebase --abort

Rebase 的特点

  • 创建线性的提交历史
  • 重写提交历史
  • 历史记录更清晰
  • 适合需要保持线性历史的场景

Merge vs Rebase

特性MergeRebase
历史记录保留完整历史重写历史
提交数量创建合并提交不创建新提交
历史形状分叉状线性
适用场景需要保留历史需要线性历史
风险可能产生冲突

分支工作流

Git Flow 工作流

Git Flow 是一种经典的分支管理模型,适合有计划发布周期的项目。

主要分支

  • master:生产环境分支,始终保持稳定
  • develop:开发分支,集成了所有功能开发

辅助分支

  • feature:功能分支,从 develop 分支创建
  • release:发布分支,从 develop 分支创建
  • hotfix:修复分支,从 master 分支创建

工作流程

bash
# 1. 从 develop 创建功能分支
git checkout -b feature/new-feature develop

# 2. 开发完成后合并回 develop
git checkout develop
git merge --no-ff feature/new-feature

# 3. 从 develop 创建发布分支
git checkout -b release/1.0.0 develop

# 4. 发布完成后合并到 master 和 develop
git checkout master
git merge --no-ff release/1.0.0
git checkout develop
git merge --no-ff release/1.0.0

# 5. 从 master 创建修复分支
git checkout -b hotfix/critical-fix master

# 6. 修复完成后合并到 master 和 develop
git checkout master
git merge --no-ff hotfix/critical-fix
git checkout develop
git merge --no-ff hotfix/critical-fix

GitHub Flow 工作流

GitHub Flow 是一种简化的工作流,适合持续部署的项目。

主要分支

  • main:主分支,始终保持可部署状态

工作流程

bash
# 1. 从 main 创建功能分支
git checkout -b feature/new-feature main

# 2. 开发并提交
git add .
git commit -m "Add new feature"

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

# 4. 创建 Pull Request

# 5. 代码审查通过后合并到 main

# 6. 部署

GitLab Flow 工作流

GitLab Flow 结合了 Git Flow 和 GitHub Flow 的优点。

主要分支

  • main:主分支
  • production:生产环境分支
  • staging:预发布环境分支

工作流程

bash
# 1. 从 main 创建功能分支
git checkout -b feature/new-feature main

# 2. 开发完成后合并回 main

# 3. 从 main 创建环境分支
git checkout -b staging main
git checkout -b production main

# 4. 使用合并请求在不同环境间升级

分支冲突解决

冲突产生的原因

  • 两个分支修改了同一文件的同一行
  • 一个分支修改了文件,另一个分支删除了文件
  • 两个分支重命名了同一文件

解决冲突的步骤

bash
# 1. 尝试合并
git merge <branch-name>

# 2. 如果有冲突,Git 会提示
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 3. 查看冲突文件
git status

# 4. 编辑冲突文件,解决冲突
# 冲突标记:
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 合并分支的内容
# >>>>>>> branch-name

# 5. 添加解决后的文件
git add <file-name>

# 6. 完成合并
git commit

冲突解决工具

bash
# 使用合并工具
git mergetool

# 查看冲突文件
git diff --check

# 放弃解决冲突
git merge --abort

分支策略

功能分支策略

每个新功能都在独立的分支上开发,完成后合并到主分支。

优点

  • 功能隔离
  • 易于代码审查
  • 可以并行开发

缺点

  • 分支管理复杂
  • 合并可能产生冲突

发布分支策略

为每个发布版本创建独立分支,用于准备发布。

优点

  • 发布准备不影响开发
  • 可以同时准备多个版本
  • 发布回滚简单

缺点

  • 需要维护多个发布分支
  • 合并复杂

修复分支策略

为紧急修复创建独立分支,快速修复生产问题。

优点

  • 快速响应
  • 不影响开发
  • 可以直接部署

缺点

  • 可能产生多个修复分支
  • 需要同步到开发分支

分支最佳实践

分支命名规范

bash
# 功能分支
feature/feature-name
feature/user-authentication

# 修复分支
bugfix/bug-description
bugfix/login-error

# 热修复分支
hotfix/critical-fix
hotfix/security-patch

# 发布分支
release/version-number
release/1.0.0

# 实验分支
experiment/experiment-name
experiment/new-ui

分支管理原则

  1. 主分支保持稳定:main/master 分支始终保持可部署状态
  2. 定期合并:定期将主分支的更改合并到功能分支
  3. 及时删除:合并完成后及时删除已完成的分支
  4. 小步提交:保持提交小而频繁
  5. 清晰命名:使用有意义的分支名称
  6. 代码审查:合并前进行代码审查

分支保护

bash
# 设置分支保护(需要通过 GitHub/GitLab 界面设置)
# - 需要 PR 审查
# - 需要通过 CI 检查
# - 限制推送权限
# - 需要状态检查通过

远程分支

跟踪分支

bash
# 查看跟踪分支
git branch -vv

# 设置跟踪分支
git branch -u <remote>/<branch>

# 推送并设置跟踪
git push -u <remote> <branch>

远程分支操作

bash
# 拉取远程分支
git fetch

# 拉取并合并远程分支
git pull

# 拉取并变基远程分支
git pull --rebase

# 推送到远程分支
git push

# 推送所有分支
git push --all

# 删除远程分支
git push <remote> --delete <branch>

分支可视化

查看分支图

bash
# 查看图形化历史
git log --graph --oneline --all

# 查看美化后的分支图
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

# 使用 gitk 图形化工具
gitk

# 使用 tig 文本界面工具
tig

分支清理

清理已合并分支

bash
# 查看已合并的分支
git branch --merged

# 删除已合并的分支
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

清理未合并分支

bash
# 查看未合并的分支
git branch --no-merged

# 强制删除未合并的分支(谨慎使用)
git branch -D <branch-name>

清理远程分支

bash
# 清理已删除的远程分支引用
git remote prune origin

# 清理所有远程分支引用
git fetch --prune

基于 VitePress 的本地知识库