必须执行git fetch --prune origin才能让本地完整同步远程分支状态,因git fetch默认不删除已不存在的远程分支引用,且git pull仅更新当前跟踪分支,无法全量刷新refs/remotes/origin/命名空间。

Git 本地仓库看不到远程分支,不是“丢了”,而是引用没同步——必须手动更新远程跟踪引用。
git fetch 不等于自动同步所有远程分支
很多人执行 git pull 后发现 git branch -r 仍不显示新创建的远程分支,因为 git pull 默认只拉取当前分支所跟踪的远程分支(即 origin/xxx),不会遍历并更新整个 refs/remotes/origin/ 命名空间。
-
git fetch origin可拉取 origin 下所有已存在分支的最新提交,但不会删除已被远程删掉的旧引用(比如别人删了feature/login,本地origin/feature/login还在) - 若远程新增了分支,且你从未 fetch 过它,
git branch -r就完全看不见它 - 想让本地完整镜像远程分支状态,得用
git fetch --prune origin(或简写git fetch -p origin)
为什么 git remote update 不总是管用
git remote update 理论上会遍历所有 remote,但实际行为取决于 remote 的配置。如果 origin 的 fetch 配置被改过(比如只写了 +refs/heads/main:),它就只会同步 main 分支,忽略其他。
- 检查当前 fetch 规则:
git config --get-all remote.origin.fetch - 标准值应为:
+refs/heads/*:refs/remotes/origin/*(注意末尾的*) - 如果缺失或写死了分支名,运行:
git config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" - 之后再
git fetch -p origin才能真正全量同步
git ls-remote 查远程真实分支(绕过本地缓存)
当你怀疑本地引用严重滞后,或想确认某分支是否真在远程存在(比如 CI 创建的临时分支),直接查服务器最可靠:
-
git ls-remote --heads origin列出远程所有 heads(即普通分支) -
git ls-remote --tags origin查看 tag(有时误把 tag 当分支) - 输出是
commit-hash refs/heads/branch-name格式,不含本地映射逻辑,纯服务端快照 - 注意:该命令不改变本地任何引用,只是诊断手段
远程分支同步的本质是维护 refs/remotes/origin/xxx 这些引用文件,它们不是“自动广播”的,每次变更都依赖显式 fetch;最容易被忽略的是 --prune —— 不加它,删掉的远程分支会在本地残留数周,直到某次手动清理或覆盖写入。











