git branch --merged 列出已完整合并到当前分支的本地分支,是清理前必须执行的第一步;它不删除任何内容,但能安全识别可删分支,需先切换至目标主干(如main或develop)再运行,避免误判。

git branch --merged 列出可安全删除的本地分支
这个命令只显示已完整合并到当前所在分支的本地分支,是清理前最该跑的第一步。它不删任何东西,但能帮你快速识别哪些分支大概率可以删。
常见错误现象:直接 git branch -d 某个分支报错 error: The branch 'xxx' is not fully merged,说明你没先确认合并状态;或者误删了还在开发中的分支,只因没切换到主干分支就执行了 --merged。
- 必须先
git checkout main(或git switch main)再运行git branch --merged,否则结果基于当前分支,不是你想清理的目标主干 - 输出里带星号
*的是当前分支,别删它;带remotes/origin/前缀的是远程追踪分支,--merged不会列出来,别混淆 - 如果项目用
develop当集成分支,就把main换成develop,否则漏掉大量已合入但未合入main的分支
git push origin --delete 删除远程分支
远程分支不会因为你本地删了就自动消失,必须显式推送空引用。这是最容易被跳过的一步,也是协作中引发混乱的源头。
使用场景:PR 合并后、CI 自动创建的临时分支(如 pr-42)、长期功能分支上线后。
- 语法统一用
git push origin --delete feature/login,比旧写法git push origin :feature/login更清晰、不易打错冒号位置 - 分支名含斜杠(如
bugfix/2026-07)不用加引号,shell 能正确解析;但若含空格或特殊字符,就得加单引号 - 如果报错
remote: error: unable to delete: protected branch,说明远端启用了分支保护策略,得先去 GitHub/GitLab 设置里临时关闭,删完再开
git fetch -p 清理本地残留的远程追踪分支
远程分支删了,但你的本地还留着 origin/feature/x 这类引用,git branch -a 里一直显示,看着烦还占内存。这不是“垃圾分支”,而是过期的远程追踪引用。
典型错误现象:执行 git branch -vv 看到某分支后面标着 [origin/xxx: gone],说明远端早没了,但本地还记着。
-
git fetch -p是最轻量、最安全的方式,它只清理本地缓存,不碰任何本地分支 - 不要用
git remote prune origin单独执行——它和git fetch -p效果一样,但后者更常用、语义更明确 - 如果团队多人共用一个仓库,建议每次拉新代码前都顺手跑一次
git fetch -p,避免越积越多
批量清理所有 [gone] 状态的本地分支
有些本地分支当初是从远程拉下来的,比如 git checkout -b feature/y origin/feature/y,后来远端删了,但本地分支还在,且没人再用——这类分支才是真·垃圾分支,需要主动识别并清理。
核心判断依据就是 git branch -vv 输出里的 : gone] 标记。
- 完整命令:
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D -
-r参数很重要:当grep没匹配到任何分支时,xargs不会报错退出,避免脚本中断 - 别省略
git fetch -p前置步骤,否则git branch -vv可能还没刷新状态,漏删或误删 - 强制删除
-D是必要的——这些分支早已失去上游,-d会拒绝执行
hotfix/ 分支到底有没有合入 main?它在远端是否已被 CI 自动清理?执行前多一眼 git log --oneline origin/main..origin/hotfix/xxx 比什么都强。











