如何批量删除已合并的 Git 分支

删除已合并的本地分支:git branch --merged | grep -v 排除保护分支 | xargs git branch -d。远程已合并分支用 git branch -r --merged 找出后逐个 git push origin --delete。删除前确认已合入正确的目标分支。

最佳实践
Git 分支协作与合并示意

先选定并更新目标分支,再列出已合并候选逐条确认;不要把过滤管道和 -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 默认可能把多个参数合成一次询问,不能称为逐分支确认。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台