git branch -a 显示本地和远程跟踪分支,远程分支带 remotes/origin/ 前缀;需 git fetch 同步后才可见,git ls-remote origin 查远程真实分支,git fetch --prune 清理陈旧引用,git branch -vv 查跟踪状态。

git branch -a 显示所有分支但远程分支带 remotes/ 前缀
默认 git branch 只列本地分支,加 -a(all)才同时显示本地和远程跟踪分支。远程分支名会带 remotes/origin/xxx 这种前缀,不是直接叫 main 或 dev —— 这是 Git 的设计,不是错误。
- 远程分支本质是本地对远程仓库状态的“缓存”,存在
.git/refs/remotes/下,所以显示时必然带命名空间前缀 - 如果刚克隆完仓库,
git branch -a可能看不到远程分支,因为还没执行过git fetch,需先同步远程引用 -
git branch -r只列远程分支(即remotes/origin/*),git branch -l等价于不加参数,只列本地分支
git ls-remote origin 查看远程真实分支名(不依赖本地缓存)
当怀疑本地分支列表不准(比如别人刚推了新分支,你还没 fetch),用 git ls-remote origin 直接查远程仓库的 refs。它绕过本地 refs/remotes,返回服务器当前真实的分支快照。
- 输出是哈希值 + 引用路径,例如
abc123456789 refs/heads/main,其中refs/heads/后面的就是真实分支名 - 这个命令不改变本地状态,也不下载代码,适合快速确认远程有没有某分支
- 注意:如果远程有权限限制(如私有仓库 token 过期),可能报错
fatal: unable to access 'https://...': Failed to connect to ...
git fetch --prune 清理已删除的远程分支引用
远程分支被删后,本地 git branch -a 仍会显示 remotes/origin/deleted-branch,这是“陈旧引用”。必须主动清理,否则列表越来越杂。
-
git fetch --prune(或简写git fetch -p)会拉取最新远程信息,并自动删掉本地已不存在对应远程分支的remotes/origin/*条目 - 也可以配成默认行为:
git config --global fetch.prune true,之后每次git fetch都自动 prune - 误删?不用担心 ——
remotes/origin/*是只读缓存,删了再git fetch就能恢复;但本地跟踪分支(如origin/main对应的main)不会被影响
git branch -vv 看分支关联和滞后/超前状态
光知道分支存在不够,还得知道它跟踪谁、是否同步。用 git branch -vv(verbose ×2)能同时看到本地分支、跟踪分支、提交差异。
- 输出形如:
main abc123 [origin/main: ahead 2] Merge feature-x,其中ahead 2表示本地比远程多 2 个提交 - 如果显示
[origin/main: gone],说明本地分支还在,但远程分支已被删,此时该运行git branch --unset-upstream解除无效跟踪 - 这个命令不显示纯远程分支(
remotes/origin/*),只显示本地分支及其跟踪关系 —— 别指望靠它替代-a
--prune,判断同步状态得看 -vv 的方括号里写了啥。这些细节不常报错,但会悄悄让分支管理变模糊。


















