git branch 是什么
git branch 负责分支的列出、创建、改名与删除。分支在 Git 里只是一个指向某次提交的轻量指针,创建与切换的代价几乎为零,所以「为每个任务开一条短分支」是可行的默认做法。要注意 branch 本身只创建不切换,切换需要用 git switch。
指针视角看分支
把分支理解成指针,很多行为就顺了:提交时当前分支指针自动前移;合并时指针被移动到新位置;删除分支只是删掉一个引用,提交对象在 reflog 过期前依然存在。git branch -v 告诉你每条分支指向哪个提交,-vv 还会显示上游关系与领先落后数。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.23 起用 switch 切换) |
|---|---|
| 语法 | git branch [选项] [<分支名>] [<起点>] |
| 列出 | -a 含远端;-r 只看远端;-vv 显示上游与领先落后 |
| 创建 | git branch <名称> [<起点>],只创建不切换 |
| 改名 | -m 重命名,-M 强制重命名 |
| 删除 | -d 已合并才删,-D 强制删除 |
典型使用场景
- 按任务开分支:每个需求或修复各自一条分支,互相隔离
- 查看全貌:用 -a 或 -vv 看清本地与远端分支及跟踪关系
- 清理分支:合并完成后删除已合入的功能分支
- 改名规范:把写错的名字用 -m 修正,避免在远端重复建分支
- 从历史点起步:以标签或提交为起点开热修复分支
- 排查遗留:找回被删分支上的提交(配合 git reflog)
常用示例
常用示例
git branch # 列出本地分支,当前分支带星号
git branch -a # 含远端跟踪分支
git branch -vv # 显示上游关系与领先落后
git branch feature/login # 创建分支但不切换
git branch hotfix/1.2.1 v1.2.0 # 以标签为起点创建分支
git branch -m old-name new-name # 重命名分支
git branch -d feature/login # 删除已合并的分支
git branch -D feature/wip # 强制删除未合并的分支常用选项对照
| 选项 | 含义 | 风险提示 |
|---|---|---|
| -a | 列出本地与远端全部分支 | 远端分支不能直接切换提交 |
| -r | 只列远端跟踪分支 | 需要先 fetch 才是最新 |
| -v | 显示每条分支指向的提交 | 快速定位分支落点 |
| -vv | 附上游与领先落后数 | 排查推送目标最有用 |
| -m | 重命名分支 | 改名前确认远端是否已有同名 |
| -d | 删除已合并分支 | 未合并时会被拒绝 |
| -D | 强制删除分支 | 未合并内容会失去引用 |
按任务开短分支是协作基线:主线保持随时可发布,改动隔离在分支上,评审与回滚都更简单。
-d 对未合并分支会直接拒绝,这是保护机制。确实不需要时再用 -D,但先确认那些提交的内容真的可以丢弃。
分支默认只存在于本地。要让团队看到,需要 git push -u 把它推上去并建立跟踪关系。
删除分支只是删掉引用,提交对象仍会在 reflog 中保留一段时间。误删后可以用 git reflog 找到分支尖端再重新建回来。
分支命名与生命周期
分支名建议写成「类别/简短描述」的形式,例如 feature/login、fix/order-timeout、hotfix/1.2.1,既方便按前缀筛选,也能在列表里一眼看出用途。生命周期上功能分支越短越好:合入后立即删除,避免同一条分支长期存在、反复同步主干而产生大量没有意义的合并提交。
git branch 只创建不切换,新手最常见的错误是建完分支以为已经在上面,结果继续在旧分支提交。用 git branch --show-current 确认当前所在分支。
远端分支被删除后,本地的远端跟踪引用不会自动消失。用 git fetch --prune 清理,避免 git branch -r 里一直显示出早已不存在的分支。