如何批量删除已合并的 Git 分支
删除已合并的本地分支:git branch --merged | grep -v 排除保护分支 | xargs git branch -d。远程已合并分支用 git branch -r --merged 找出后逐个 git push origin --delete。删除前确认已合入正确的目标分支。
先选定并更新目标分支,再列出已合并候选逐条确认;不要把过滤管道和 -d 当成不会误删的保证。
清理本地分支
git checkout main
git pull # 确保 main 最新
git branch --merged main --format='%(refname:short)'
# 人工确认排除 main/master/develop、保留分支和其他 worktree 使用中的分支
git branch -d -- feature/confirmed-old
git branch --merged:列出已合并进当前分支的本地分支;- 按完整分支名排除保护分支,避免子串过滤误判;
- git branch -d 检查已配置的 upstream(无 upstream 才检查 HEAD),不是始终检查你指定的清理目标;仍需先核对候选。
清理远程分支
git fetch --prune # 先清掉远程已删的引用
# 列出已合并的远程分支(排除保护分支)
git branch -r --merged | grep -vE 'main|master|develop|HEAD'
# 逐个删除(确认后再执行)
git push origin --delete feature/old-1
GitHub 上合并 PR 时勾选 "Delete branch",或仓库设置开启自动删除,可以从源头减少堆积。
常见问题(FAQ)
Q:--merged 判断的基准是什么?
相对于当前所在分支。在 main 上执行就是"已合入 main"。分支若只合入了 develop 没合入 main,在 main 上跑时不会被列出;squash/rebase 合并可能内容相同但原提交不是祖先,因此 --merged 不一定列出。
Q:删除分支会删提交吗?
不会。已合并的提交都在 main 的历史里,删分支只是删一个指针。未合并分支被 -D 强删才有丢提交的风险。
Q:有没有交互式逐条确认的方式?
先列出候选手工逐条执行最直观;xargs -p 默认可能把多个参数合成一次询问,不能称为逐分支确认。