我想查看作为提交abcdef1234
的祖先的所有分支。
这与相反
git branch --contains abcdef1234
上面的命令将列出作为abcdef1234
的子代的所有分支。我想查看作为abcdef1234
祖先的所有分支的列表。
我也对标签的等价物感兴趣。
更新
更清楚地说,我的意思是,我想看到一个符合两个标准的所有提交的列表:
- 他们是
abcdef1234
的祖先 - 它们当前由(本地或远程)分支指向
显然,大多数提交在某个时候都有一个分支指向它们,当它们是全新的时。我只感兴趣的是,在这个特殊的时刻,它们是否是分支机构。
git branch --merged abcdef1234
应该做您想做的事情。它列出了合并到命名提交中的所有分支(因此是它的祖先),即那些可以从命名提交访问其提示提交的分支。
以下是我以扩展形式提出的评论。(我想这就是你想要的。)
我们将K设置为您选择的提交(在您的示例中为abcdefg1234
)。然后,我们希望遍历所有标签L,其中L的形式为refs/heads/*
或refs/remotes/*
(所有分支和远程跟踪分支)。每个标签L都指向一些特定的提交C。如果C是K的祖先,请打印标签L。
[编辑:正如sschuberth所回答的,这只是git branch --merged
;我想的新功能是git for-each-ref
现在也实现了--merged
,这意味着你可以更容易地编写脚本,但如果你只想要名称,git branch
就可以了。如果你确实想要标签,请参阅git tag --merged
(如果可用)。如果你的Git版本太旧,请继续阅读脚本。:-)]
这里有一个shell脚本(未经测试!)实现了这一点。请注意,git for-each-ref
在Git的后续版本中有新的功能,可以简化这一点,但它应该一直工作到1.6-ish——也许是1.7-ish;我忘了git merge-base
是什么时候获得--is-ancestor
的。
#! /bin/sh
# find branches and remote-tracking branches that targt
# ancestors of $1.
showthem() {
local tgt label lbltgt
tgt=$(git rev-parse "$1") || return $?
git for-each-ref --format='%(refname:short) %(objectname)'
refs/heads refs/remotes |
while read label lbltgt; do
if git merge-base --is-ancestor $lbltgt $tgt; then
echo "$label"
fi
done
return 0
}
case $# in
0) usage 1>&2; exit 1;;
1) showthem "$1";;
*) for i do "echo ${i}:"; showthem "$i" || exit; done
esac
(您可能需要稍微调整一下,例如,放弃像origin/HEAD
这样的符号引用。)
comm -23 <(git branch -a | sort) <(git branch -a --contains abcdefg1234 | sort)
这将为您提供所有没有提交abcdefg1234
的分支;它是CCD_ 19的输出减去CCD_。