git branch -a 可一次性列出本地和远程所有分支,远程分支以 remotes/origin/xxx 形式显示;但需先执行 git fetch 同步远程引用,否则新分支不可见。

想一眼看清所有分支,别用 git branch 单独查本地、再手动翻远程——它默认只显示本地分支,远程分支压根不出现。
查看所有本地分支(含当前所在分支)
执行 git branch 就够了,输出里带 * 的就是当前 HEAD 所在分支。注意:这个命令不显示远程分支,也不显示已合并但未删除的本地分支(除非加 -a 或 --all)。
常见误操作:
- 忘记加 -v 查看最新提交摘要,导致分不清哪个分支更新最晚
- 用 git branch -r 想看“所有分支”,结果只看到远程跟踪分支,漏掉本地分支
建议组合使用:
- git branch -v:带提交简讯,方便快速判断活跃度
- git branch --format="%(refname:short) %(upstream:short) %(objectname:short)":自定义输出,适合脚本解析
查看所有远程分支(包括未跟踪的)
git ls-remote --heads origin 是最直接的方式,它绕过本地 ref,直连远程仓库列出所有 refs/heads/ 下的分支。比 git branch -r 更真实——后者只显示你本地已记录的远程跟踪分支(即 origin/xxx),而远程可能早已新增或删掉某些分支。
关键区别:
- git branch -r 显示的是你上次 git fetch 后缓存的远程分支快照
- git ls-remote 是实时查询,但不创建本地跟踪引用
- 如果远程分支被删了,git branch -r 还会残留旧记录,需手动 git remote prune origin
实用技巧:
- git ls-remote --heads origin | wc -l 快速统计远程分支数
- 配合 grep 筛选:git ls-remote --heads origin | grep "feature/"
一次性列出本地 + 远程所有分支(含状态对比)
用 git branch -a 最省事,但它把远程分支显示为 remotes/origin/xxx,格式冗长,且不区分“已同步”“有新提交”“已过期”。更实用的是:git branch -vv。
这个命令同时列出:
- 所有本地分支
- 对应的上游(upstream)分支(如 origin/main)
- 本地与上游的偏离提交数([origin/main: ahead 2, behind 1])
- 最后一次提交摘要
注意点:
- 如果某分支没设置 upstream,就不会显示方括号里的状态信息
- git branch -vv 不显示纯远程分支(如 origin/dev 本身),只显示你本地建的、且关联了远程的分支
- 想强制刷新上游状态,先 git fetch,再跑 git branch -vv
为什么 git branch -a 有时看不到刚推送的新分支?
因为 git push origin new-branch 只是把 commit 推到远程,并不会自动让本地知道这个分支存在。本地的 remotes/origin/new-branch 引用需要靠 git fetch 拉取更新。
典型现象:
- 推完新分支,立刻 git branch -a,列表里没有 remotes/origin/new-branch
- git fetch origin 之后才出现
解决方案:
- 推送后顺手执行 git fetch origin
- 或者用 git push -u origin new-branch,这样不仅推送,还自动设置 upstream,后续 git branch -vv 就能直接看到状态
- 别依赖 git branch -a 做分支发现,它只是本地引用快照,不是远程实时视图
真正容易被忽略的是:远程分支名和本地跟踪分支名是两套体系。比如远程有个 bugfix/login-timeout,你本地没建对应分支,也没 fetch 过,那它就“不存在”于你的 git branch 视图里——哪怕它真正在远程仓库里活得好好的。


















