git remote prune 只删除远程追踪分支(如 origin/feature/login),不删除本地分支(如 feature/login);需配合 git fetch --prune 和安全判断逻辑才能清理已合并且无远程对应的本地分支。

git remote prune 之后为什么本地分支还在?
因为 git remote prune 只清理「远程追踪分支」(比如 origin/feature/login),不会动你本地的 feature/login。很多人以为 prune 就是删干净了,结果一查 git branch 还是一堆旧分支——这是最常踩的坑。
如何安全识别哪些本地分支已合并且无远程对应?
得组合两个条件:分支在当前主干(通常是 main 或 master)上已合并 + 没有对应的远程追踪分支。用这条命令能列出来:
git branch --merged main --format='%(refname:short)' | grep -v '^main$' | xargs -r git show-ref --verify --quiet refs/remotes/origin/{} 2>/dev/null || echo {}
但太长难记,所以才需要 alias。真正实用的判断逻辑是:
- 用
git branch --merged main筛出已合并分支 - 排除
main、develop等保护分支(按团队约定) - 对每个分支执行
git rev-parse --verify origin/{branch} &>/dev/null,失败说明远程已删
一行 alias 的写法和关键细节
在 ~/.gitconfig 里加这个 alias:
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
[alias]
cleanup-merged = "!f() { git branch --merged main | grep -vE '^(\*|main|develop)$' | xargs -r bash -c 'for b; do git rev-parse --verify origin/$b >/dev/null 2>&1 || git branch -d $b; done' _; }; f"
注意几个硬伤点:
-
main要替换成你实际的主干分支名(比如master) -
develop是可选保护分支,多个就用|连,如^(\*|main|develop|release/) -
git branch -d是安全删除(只删已合并的),想强制删用-D,但不推荐 - Windows 用户需改用 Git Bash,CMD 不支持这种 shell 函数写法
执行前务必先确认远程状态
别跳过这步:运行 git fetch --prune,否则 origin/xxx 的引用还是旧的,会导致误判。alias 里不自动加 fetch,是因为有些团队禁止自动 fetch(比如大仓耗时太久)。顺手加个提醒:
执行 git cleanup-merged 前,先敲 git fetch --prune —— 这一步漏掉,90% 的“删错分支”都发生在这里。










