检出release分支头后如何获取已合并至master的已删除Git分支名
常规查询命令的失效原因
你执行的git branch --list -a --merged,本质是遍历本地仓库现存的所有分支引用(也就是refs目录下仍未删除的指针文件),筛选出已合并到当前检出分支的条目。那些合并到master后就被删除的特性分支,对应的分支指针已经被从refs目录移除,自然不会出现在返回结果里。
分支本身只是指向特定提交的轻量指针,并非独立存放在Git对象库的实体,只要指针被删除,常规的git branch类命令就无法感知到它的存在。
具体查询方式
因为你的release分支是从master分支合并而来的,当前检出的release提交历史,已经完整覆盖了master分支上所有曾经合入的提交记录,不需要额外切回master就可以完成查询:
- 依托Git留存的全量reflog记录(reflog会保存所有分支指针的变动历史,哪怕分支本身已经被删除),可以追溯出所有曾经存在过的分支名称,再通过提交的祖先关联关系,筛选出已合并进master的被删除分支。
- 直接执行下面的命令,就能一次性返回所有符合查询要求的已删除分支名称:
git reflog show --all --format='%gs' | grep -E 'moving from [^/]+/' | awk -F'/' '{print $NF}' | sort -u | xargs -I{} sh -c 'git merge-base --is-ancestor {} master 2>/dev/null && echo {}'
命令执行逻辑
- 先通过全量reflog抓取所有曾经发生过指针变动的分支名,不管分支现在是否仍然存在
- 再通过
git merge-base --is-ancestor做校验:如果某个分支曾经指向的提交历史,是master分支当前提交的祖先,就说明这个分支在被删除前,已经成功合并进了master分支 - 整个过程不需要额外拉取远程仓库数据,基于本地已有的提交历史和reflog记录就可以完成查询
注意:如果本地reflog已经因为过期触发了自动清理,这类被删除的分支记录将无法通过本地查询找回,需要依托远程仓库的合并记录反向追溯。
内容的提问来源于stack exchange,提问作者Lurk21
相关产品推荐
相关产品推荐

