为何git checkout会记忆已删除分支?如何清理残留补全分支记录
清理git checkout自动补全残留分支的方法
这些出现在Tab补全列表里、但git branch -a查不到、也没法用git branch -D删除的分支,根本不是git特意存的什么特殊记忆列表,本质就是两类残留:一是本地没同步清掉的失效远程跟踪引用/没删干净的本地脏引用,二是shell的git补全脚本缓存了旧的分支列表,按下面步骤走就能清干净:
- 第一步:修剪失效的远程跟踪引用
九成以上的残留分支都是远程端已经删了、但本地没同步清理的跟踪引用,直接跑下面的命令同步清理就行:git fetch --prune
要是不想触发远程拉取,只想直接清本地存的失效远程引用,也可以跑:git remote prune origin
命令里的origin换成你自己用的远程仓库名就行,默认场景下都是origin。 - 第二步:清理本地残留的脏引用
如果跑完上面的命令还能看到残留分支,说明.git/refs目录下留了没被正常删除的引用文件,先执行命令查残留引用:git show-ref | grep 你看到的残留分支名
要是能查到对应记录,直接去.git目录下删对应文件就行:本地分支的引用存在.git/refs/heads/路径下,远程跟踪分支的引用存在.git/refs/remotes/路径下,删完跑一句git gc --prune=now清理掉无效的git对象就好。 - 第三步:刷新shell补全缓存
清完git侧的引用之后如果补全列表还显示旧分支,就是shell的补全缓存没更新,直接重启当前shell会话就能解决:- bash用户执行
exec bash - zsh用户可以执行
exec zsh,或者跑rm -f ~/.zcompdump*; compinit手动清空补全缓存重新加载 - fish用户执行
exec fish
- bash用户执行
别上来就乱删.git目录下的未知文件,优先用prune命令处理,绝大多数场景第一步就能解决问题,根本不需要碰底层引用文件。
内容的提问来源于stack exchange,提问作者zheyuanWang
相关产品推荐
相关产品推荐

