Git中文社区

分支管理

SVN 等工具创建分支要复制整个目录,Git 的分支则只是一个指针,创建和切换都很快。所以用 Git 时,哪怕只改一个小 Bug,也可以单独开一个分支。

为什么要用分支

设想你正在开发一个新功能,突然线上出现了一个紧急 Bug。如果没有分支,你只能把写了一半的代码和修复混在一起。有了分支:

  1. 新功能在 feature 分支上开发;
  2. 切回 main,新建 hotfix 分支修复 Bug 并上线;
  3. 再切回 feature 继续开发,互不干扰。

分支的本质

前面讲过,Git 的分支只是一个指向提交的可移动指针,本质上是 .git/refs/heads/ 目录下的一个文件,里面只记录了一个 40 位的提交哈希:

cat .git/refs/heads/main
# ca82a6dff817ec66f44342007202690a93763949

所以创建一个分支,只需要写入 41 个字节,非常快。

查看分支

# 列出本地分支,当前分支前有 * 号
git branch

# 同时显示每个分支的最新提交
git branch -v

# 列出远程分支
git branch -r

# 列出所有分支
git branch -a

# 查看已合并 / 未合并到当前分支的分支
git branch --merged
git branch --no-merged

创建分支

# 创建分支(但不切换)
git branch feature-login

# 基于指定提交或分支创建
git branch hotfix v1.0

切换分支

从 Git 2.23 开始,推荐使用专门的 git switch 命令切换分支:

# 切换到已有分支
git switch feature-login

# 创建并切换到新分支
git switch -c feature-login

# 切换回上一个分支
git switch -

在旧版本中使用 git checkout,它依然可用:

git checkout feature-login
git checkout -b feature-login

注意

git checkout 身兼数职(切换分支、恢复文件……),容易误用。因此 Git 把它拆分成了 git switch(切换分支)和 git restore(恢复文件)两个命令,建议新手直接使用新命令。

切换分支时有未提交的修改

如果工作区有未提交的修改,并且与目标分支冲突,Git 会拒绝切换。你可以:

  • 先提交修改;
  • 使用 git stash 临时储藏(见"储藏工作进度"一章);
  • 或使用 git switch -f 强制切换并丢弃修改(慎用)。

重命名分支

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

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

如果分支已经推送到远程,还需要推送新分支并删除旧的远程分支:

git push origin -u new-name
git push origin --delete old-name

删除分支

# 删除已合并的分支
git branch -d feature-login

# 强制删除未合并的分支
git branch -D feature-login

# 删除远程分支
git push origin --delete feature-login

分支命名建议

良好的分支命名能让团队一眼看出分支的用途:

前缀用途示例
feature/新功能feature/user-login
fix/ 或 bugfix/修复 Bugfix/order-total
hotfix/紧急线上修复hotfix/payment-crash
release/发布准备release/2.1.0
docs/文档docs/api-guide

分离头指针

如果直接切换到一个提交而不是分支,就会进入"分离头指针"状态:

git switch --detach a1b2c3d
# 或
git checkout a1b2c3d

这时可以查看、测试旧代码。如果在此状态下做了提交并想保留,需要为它创建一个分支:

git switch -c keep-my-work