分支管理
SVN 等工具创建分支要复制整个目录,Git 的分支则只是一个指针,创建和切换都很快。所以用 Git 时,哪怕只改一个小 Bug,也可以单独开一个分支。
为什么要用分支
设想你正在开发一个新功能,突然线上出现了一个紧急 Bug。如果没有分支,你只能把写了一半的代码和修复混在一起。有了分支:
- 新功能在
feature分支上开发; - 切回
main,新建hotfix分支修复 Bug 并上线; - 再切回
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/ | 修复 Bug | fix/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