git branch --merged 列出已完全合并进当前分支的本地分支,仅基于提交图可达性判断,不包含远程跟踪分支;需先切换到目标分支或指定 commit-ish(如 origin/main)作为基准,且须确保本地已 fetch 最新远程引用。

git branch --merged 列出已合并到当前分支的本地分支
执行 git branch --merged 会列出所有**已完全合并进当前所在分支**的本地分支(不含远程跟踪分支)。它不关心这些分支是否“已完成”或“可删除”,只做拓扑判断:目标分支的 HEAD 是否可达于当前分支的提交图中。
常见误用是直接在 main 分支上运行,以为能找出“所有被合并过的功能分支”,结果漏掉那些合并进 develop 或 release/* 的分支。实际得先 git checkout 到你关心的“主干目标分支”再查。
- 如果想看哪些分支已合并进
main,先git checkout main,再运行git branch --merged - 输出中带
*的是当前分支;remotes/origin/xxx不会出现——--merged默认只扫本地分支 - 该命令不区分 merge commit 是 --no-ff 还是 fast-forward,只要图可达就计入
git branch --merged origin/main 查找已合并进远程分支的本地分支
git branch --merged 支持指定一个提交(commit-ish)作为比较基准,比如 origin/main。这能绕过“必须先切到远程分支”的限制,但前提是本地已通过 git fetch 更新过远程引用。
典型错误是没 fetch 就查,导致结果陈旧。例如远程 origin/main 已前进 5 个提交,而本地 origin/main 还停在上周,那 git branch --merged origin/main 就会漏掉最近合并的分支。
- 务必先执行
git fetch origin(或git fetch --all) - 基准可以是任意 commit-ish:
git branch --merged HEAD~3、git branch --merged v1.2.0都合法 - 注意:
origin/main是远程跟踪分支,不是远程分支本身;Git 不允许直接用refs/remotes/origin/main以外的形式传参
git branch --merged 和 --no-merged 的组合过滤常被忽略
单独用 --merged 只给出“已合并”的集合,但真实场景中,你往往需要排除掉仍在开发中的分支(比如名字含 feature/ 但尚未合入)、或者排除掉默认分支本身(如 main、develop)。
这时候靠 shell 管道过滤最直接,也最可控。别依赖 Git 内置的复杂正则支持——它的 --format 和 --contains 组合容易写错且难调试。
- 排除
main和develop:git branch --merged origin/main | grep -vE '^(\* )?(main|develop)$' - 只保留
feature/和bugfix/开头的已合并分支:git branch --merged origin/main | grep -E '^(\* )?(feature|bugfix)/' - 加
--format='%(refname:short)'不必要——git branch默认输出就是短名,加了反而可能因版本差异出错
真正安全删除前必须验证是否真的不需要了
git branch -d 虽然只删已合并分支,但它不会检查该分支是否被其他未拉取的远程分支引用、是否在 CI 流水线中被硬编码、或者是否还有未 push 的 tag 指向其提交。一次 -D 强删可能让某次 hotfix 失去上下文。
建议把“查找 → 人工确认 → 删除”做成原子操作。别写成一键删全量的脚本,尤其当团队共用同一个远端时。
- 对每个待删分支,先跑
git log --oneline -n 5 <branch-name></branch-name>看最后几条提交,确认无遗漏信息 - 检查是否有 tag 指向它:
git for-each-ref --format='%(refname:short) %(objectname)' refs/tags | grep $(git rev-parse <branch-name>)</branch-name> - 删除后,本地分支消失,但远程分支仍存在;删远程需单独
git push origin --delete <branch-name></branch-name>











