如何列出作为提交祖先的所有分支?

时间:2016-05-13 18:35:14

标签: git

我希望看到所有分支都是提交abcdef1234的祖先。

这是反过来的:

git branch --contains abcdef1234

上述命令将列出abcdef1234后代的所有分支。我希望看到所有分支的列表,这些分支是abcdef1234

的祖先

我也对标签的等价物感兴趣。

更新

为了更清楚,我的意思是我想查看满足2个条件的所有提交的列表:

  1. 他们是abcdef1234
  2. 的祖先
  3. 目前(本地或远程)分支机构指出它们。
  4. 显然,大多数提交在某些时候有一个分支指向它们是全新的。我只对在这个特定时刻是否是分支机构感兴趣。

3 个答案:

答案 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的输出。