我如何列出作为提交祖先的所有分支?
我想看到所有分支是abcdef1234
祖先。
这与以下情况相反:
git branch --contains abcdef1234
上面的命令会列出所有abcdef1234
后代的abcdef1234
。 我想查看abcdef1234
祖先的所有分支的列表。
我也对标签的等价物感兴趣。
UPDATE
为了更加清楚,我的意思是我想看到满足2个条件的所有提交列表:
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
的分支; 它是git branch -a
的输出git branch -a
减去git branch -a
的输出git branch -a --contains abcdefg1234
。
上一篇: How can I list all branches that are ancestors of a commit?
下一篇: how can I check whether a branch has been merged into another branch?