安全删除用 git branch -d,强制删除用 git branch -D;-d 会检查分支是否已完全合并到当前分支,未合并则拒绝删除并报错,防止误删;-D 跳过检查直接删除,未合并提交可能永久丢失。

git branch -d 和 git branch -D 到底该用哪个
安全删除用 git branch -d,强制删除用 git branch -D。区别不在“删不删得掉”,而在 Git 是否替你拦住一次误操作。
当你执行 git branch -d feature/login,Git 会检查这个分支的全部提交是否已存在于当前所在分支(比如 main)的提交历史中。如果没完全合并,就拒绝删除,并报错:error: The branch 'feature/login' is not fully merged.
- 日常清理建议始终先试
git branch -d,失败再看提示决定下一步 - CI/CD 脚本里常用
-D,因为不能卡在交互式提示上 -
-D不做任何校验,删完即丢,未合并的提交对象会变成“悬空对象”,后续git gc可能直接回收 - 想提前预览哪些分支能被安全删,运行
git branch --merged;想查哪些还挂着未合并提交,用git branch --no-merged
删不掉当前分支?先切走再说
Git 不允许你删除自己正站在上面的分支——这不是限制,是保护机制。报错通常是:error: Cannot delete branch 'dev' checked out at '/path/to/repo'。
- 必须先切换到其他分支,比如
git checkout main或git switch main - 终端里带
*的那行就是当前分支,删之前务必确认它不是目标分支 - 如果只是临时清理,切过去后别忘了再切回来,否则后续提交会落到别的分支上
批量删本地分支:grep + xargs 是主力,但要注意空格和特殊字符
手动敲 git branch -d a && git branch -d b && ... 效率低还容易漏。用管道组合更可靠,但默认行为对含空格或特殊符号的分支名不友好。
- 安全批量删所有已合并、非当前、非
main/master的分支:git branch --merged | grep -v "^\*\|main\|master" | xargs -r git branch -d - 想删所有以
ci-开头的临时分支:git branch | grep "^ci-" | xargs -r git branch -D -
-r参数很重要:防止xargs在输入为空时误执行git branch -d(这会删当前分支) - 分支名含空格?改用
while read循环更稳妥:git branch | grep "temp-" | while read b; do git branch -D "$b"; done
删完分支,磁盘空间还是很大?git gc 才是收尾关键
删分支只是移除引用,底层对象(commit、tree、blob)还在 Git 对象库里,直到被垃圾回收清理。尤其在 Windows 上,仓库体积长期不缩是常见现象。
- 先看真实占用:
git count-objects -vH,关注size-pack行 - 触发完整回收:
git gc --prune=now --aggressive(耗时较长,适合空闲时段) - 轻量级清理可先试:
git repack -ad; git prune - 注意:
git gc会清理所有未被任何引用指向的对象——包括刚删掉的分支历史,也包括你本地stash里未保存的改动,删前请确认 stash 已处理
真正麻烦的不是命令记不住,而是删分支时没意识到:引用没了,对象还在;远程删了,本地缓存还留着;脚本跑通了,但分支名里有个空格就崩。每一步都得带验证,而不是只信“删完了”。


















