You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何列出已合并到所有指定多个Git分支的分支?

如何列出已合并到所有指定分支的Git分支?

git branch --merged或git for-each-ref --merged的多参数逻辑是或(只要分支合并到任意一个指定分支就会被列出),而非你需要的且(必须合并到所有指定分支)。这里提供几种更简洁且扩展性更好的方案:

1. 基于git merge-base的命令行脚本

直接遍历所有本地分支,检查每个分支的尖端提交是否是所有目标分支的祖先(即该分支已合并到所有目标分支):

# 替换a、b、c为你的目标分支,可任意添加更多
git for-each-ref refs/heads/ --format='%(refname:lstrip=2) %(objectname)' | while read branch commit; do
  all_merged=true
  for target in a b c; do
    if ! git merge-base --is-ancestor "$commit" "$target"; then
      all_merged=false
      break
    fi
  done
  if $all_merged; then
    echo "$branch"
  fi
done

逻辑说明:

  • git for-each-ref refs/heads/ --format='%(refname:lstrip=2) %(objectname)':输出所有本地分支名及其尖端提交的哈希值
  • git merge-base --is-ancestor $commit $target:检查分支的尖端提交是否是目标分支的祖先(等价于该分支已合并到目标分支)
  • 只有当所有目标分支都满足条件时,才输出该分支名

2. 封装为Git别名(推荐)

为了日常使用更便捷,可以把上述逻辑封装成Git别名:
打开你的.gitconfig文件,添加以下内容:

[alias]
branches-merged-all = "!f() { \
  for branch in $(git for-each-ref refs/heads/ --format='%(refname:lstrip=2)'); do \
    commit=$(git rev-parse "$branch"); \
    all_merged=true; \
    for target in \"$@\"; do \
      if ! git merge-base --is-ancestor \"$commit\" \"$target\"; then \
        all_merged=false; \
        break; \
      fi; \
    done; \
    if $all_merged; then echo \"$branch\"; fi; \
  done; \
}; f"

之后只需执行以下命令就能列出同时合并到多个目标分支的分支:

git branches-merged-all 目标分支1 目标分支2 目标分支N

对比原始方案的优势

  • 无需多次调用Git命令、排序或使用comm工具,逻辑更直观
  • 支持任意数量的目标分支,添加/修改目标分支只需调整参数
  • 可轻松扩展额外逻辑:比如排除特定分支(在遍历分支时添加if [ "$branch" = "main" ]; then continue; fi即可)

内容的提问来源于stack exchange,提问作者DBear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:22:36