git remote prune origin才是彻底清理远程分支引用的正确命令,它直接比对本地.git/refs/remotes/origin/与远程真实状态并删除已不存在的引用,而git fetch --prune因refspec限制、配置未生效或远程分支未被跟踪常失效。

git fetch --prune 为什么经常不生效
它只在 fetch 动作中“顺手”修剪,不是独立清理命令。真正失效的常见原因有三个:
• git remote set-branches origin '*' 没配——Git 默认可能只跟踪 main 和 develop,导致其他分支的本地引用压根没被纳入同步范围,--prune 就无从判断该删谁
• 你用的是 git pull,而 pull 不继承 fetch.prune 配置(哪怕全局设了 fetch.prune true)
• 远程配置了 refspec 过滤(比如 +refs/heads/main:refs/remotes/origin/main),fetch --prune 就不会扫描未显式声明的分支
真正能清掉 origin/xxx 的命令是 git remote prune origin
这个命令不依赖 fetch,直接比对 .git/refs/remotes/origin/ 下所有文件和远程真实状态,远程没了,本地就删。
• 它比 git fetch --prune 更彻底,尤其适合远程已删、但本地 git branch -r 还挂着一堆 origin/feature/xxx 的情况
• 执行后会输出类似 [pruned] origin/feature/login 的提示,说明已清理
• 如果 remote 名不是 origin(比如是 upstream),记得换成 git remote prune upstream
VSCode 分支列表卡在旧状态?不是重启,是两步硬操作
VSCode 的 Git 扩展缓存的是上一次 “Sync” 时的数据,不是实时读取 git branch -r 输出。
• 先运行 git remote prune origin —— 清 Git 层残留引用
• 再按 Ctrl+Shift+P(macOS 是 Cmd+Shift+P),输入「Git: Sync」并执行 —— 强制刷新扩展内存缓存
• 注意:只点界面右下角的「Fetch」或「Pull」按钮,无法触发分支列表更新;必须显式调用「Git: Sync」
审计 GitHub Actions 工作流文件的密钥泄露风险,例如 pull_request_target 密钥使用、密钥回显命令及未固定版本的 Action 密钥传递。
删完远程分支后,本地还显示 origin/xxx?手动删引用最可靠
即使 git push origin --delete feature/login 成功,git branch -r 仍可能列出 origin/feature/login,这是本地残留的远程跟踪引用。
• 优先试 git fetch --prune,多数情况能清掉
• 若还有残留,直接删引用:git update-ref -d refs/remotes/origin/feature/login
• 删完建议再补一次 git fetch --prune,确保远程元数据完整同步
• 别用 git branch -r -d,这个命令根本不存在——git branch -r 只是查看,不能删
真正容易被忽略的一点是:Git 从不自动同步远程分支的增删。所有“过期”都源于你没主动刷新,而不是 Git 忘了。缓存不是 bug,是设计;清理不是补救,是日常动作。










