如何清理远程已删除的本地跟踪分支
清理失效的远程跟踪引用:git fetch --prune(或 git remote prune origin)删除远程已不存在的 origin/ 引用;本地残留的对应分支用 git branch -vv 找 ": gone]" 标记后批量删除。
两步清理:① git fetch --prune——删除远程已经不存在的 origin/* 跟踪引用;② 清理对应的本地分支——git branch -vv 里标记 : gone] 的就是远程已删的,配合一条组合命令批量删除。
第一步:清理远程跟踪引用
git fetch --prune
# 或只清理不拉取
git remote prune origin
# 让以后每次 fetch 自动清理
git config --global fetch.prune true
第二步:清理本地分支
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d
git branch -vv里[origin/feature-x: gone]表示跟踪的远程分支已消失;awk提取分支名交给git branch -d安全删除(有未合并改动的会被拒,改用 -D 需三思)。
预防堆积
- GitHub 仓库设置开启 Automatically delete head branches——PR 合并后自动删远程分支;
- 本地养成
fetch --prune习惯(设成默认后一劳永逸); - 定期
git branch --merged清理已合并的本地分支。
常见问题(FAQ)
Q:prune 会删我本地分支吗?
不会。fetch --prune 只清理 origin/* 这类远程跟踪引用。本地分支要靠第二步的命令删,而且 -d 有未合并保护。
Q:": gone]" 的分支还有未推送提交怎么办?
git branch -d 会拒绝(因为该分支相对其上游有独有提交)。确认这些提交没用后 git branch -D;想保留先把它推到别的远程或打 tag。
Q:fetch --prune 每次都执行会不会慢?
不会,prune 只是比对引用列表,开销可忽略。设 fetch.prune=true 全局开启最省心。