我希望看到所有分支都是提交abcdef1234
的祖先。
这是反过来的:
git branch --contains abcdef1234
上述命令将列出abcdef1234
后代的所有分支。我希望看到所有分支的列表,这些分支是abcdef1234
。
我也对标签的等价物感兴趣。
更新
为了更清楚,我的意思是我想查看满足2个条件的所有提交的列表:
abcdef1234
显然,大多数提交在某些时候有一个分支指向它们是全新的。我只对在这个特定时刻是否是分支机构感兴趣。
答案 0 :(得分:4)
git branch --merged abcdef1234
应该做你想做的事。它列出了合并到命名提交中的所有分支(因此也是它的祖先),即那些尖端提交可以从命名提交中访问的分支。
答案 1 :(得分:2)
这是我建议的扩展形式的评论。 (我认为这是你要求的。)
我们将 K 设置为您选择的提交(示例中为abcdefg1234
)。然后,我们要遍历所有标签 L ,其中 L 的格式为refs/heads/*
或refs/remotes/*
(所有分支和远程跟踪分支)。每个标签 L 指向某个特定的提交 C 。如果 C 是 K 的祖先,请打印标签 L 。
[修改:作为sschuberth answered,这只是git branch --merged
;我想到的新功能是git for-each-ref
现在也实现--merged
,这意味着您可以更轻松地编写脚本,但如果你想要的只是名称,{{ 1}}做到了。如果您确实需要标记,请参阅git branch
,如果有的话。如果您的Git版本太旧,请继续阅读脚本。 :-)]
这是一个实现此目的的shell脚本(未经测试!)。请注意git tag --merged
在Git的更高版本中具有新功能,可以简化此操作,但这应该可以一直工作到1.6-ish-maybe 1.7-ish;我忘了git for-each-ref
获得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
等符号引用。)
答案 2 :(得分:0)
comm -23 <(git branch -a | sort) <(git branch -a --contains abcdefg1234 | sort)
这将为您提供所有没有提交abcdefg1234
的分支;它是git branch -a
的输出减去git branch -a --contains abcdefg1234
的输出。