如何列出一个提交的所有祖先分支?

10

我想查看提交abcdef1234的所有祖先分支。

这有点相反:

git branch --contains abcdef1234
上述命令将列出所有后代abcdef1234的分支。我想看到所有祖先abcdef1234的分支列表。 我还对标签的等效内容感兴趣。
更新
为了更加清晰,我的意思是我想看到满足两个条件的所有提交的列表:
1.它们是abcdef1234的祖先 2.它们当前被本地或远程分支所指向。
显然,大多数提交在某个时候都有分支指向它们当它们是全新的时候。我只对它们在这个特定时刻是否有分支感兴趣。

2
你能举个例子说明分支是某个提交的祖先是什么意思吗?我有点难以理解你的问题,因为分支被实现为指向分支头部提交的“指针”,所以Git没有任何历史记录表明哪些提交过去属于哪些分支。 - Kevin
1
哪一个?“更明确地说,我想看到所有提交的列表”还是“我想看到所有分支”?您应该编辑您的问题并删除其中一个。 - Jeff Puckett
所以,您想要的是:(K 是选择的提交)对于所有标签 L:C = target(L); 如果 C 是 K 的子集:则打印 L。 - torek
@JeffPuckettII 我宁愿看到一个分支名称列表,但如果它显示了提交 SHA 的列表,我可以使用 git show-ref 或类似的东西轻松地从那里获取分支名称。 - Isaac Betesh
@torek 这是我可以在命令行上运行的东西,还是伪代码? - Isaac Betesh
显示剩余4条评论
3个回答

10

git branch --merged abcdef1234应该可以满足你的需求。它会列出所有合并到指定提交(即祖先)中的分支,也就是那些其最新提交可从指定提交到达的分支。


1
哎呀,我应该记得这个。使用“-r”运行以获取远程跟踪分支或使用“-a”获取所有分支。 - torek
这让我想到了git branch --no-merged origin/master,这也非常有用。 - Isaac Betesh
很遗憾,似乎 git tag 没有类似于 --merged 的等效选项。 - Isaac Betesh
较新版本的Git确实有git tag --merged(和--no-merged)。对于那些没有这个功能的版本,请使用我展示的for-each-ref,只需将标签名称空间设置为refs/tags即可。 - torek

2
这是我作为评论所建议的内容,以扩展形式给出。(我想这就是你所要求的。)
我们将 K 设置为您选择的提交(例如,在您的示例中为 abcdefg1234)。然后,我们希望迭代所有标签 L,其中 L 的形式为 refs/heads/*refs/remotes/*(所有分支和远程跟踪分支)。每个标签 L 指向某个特定的提交 C。如果 CK 的祖先,则打印标签 L
[编辑:如sschuberth回答,这只是git branch --merged;我想到的新功能是git for-each-ref现在也实现了--merged,这意味着你可以更容易地编写脚本,但如果你只想要名称git branch就足够了。如果你确实想要标签,请参见git tag --merged(如果可用)。如果你的Git版本太旧,请继续阅读脚本。 :-) ]
这是一个shell脚本(未经测试!)实现此操作。请注意,后续版本的Git中git for-each-ref具有新功能,可以简化此操作,但这应该适用于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这样的符号引用。)

我给你点赞是因为我欣赏你的努力,而且这确实展示了一些很酷的功能。 - Isaac Betesh

1
comm -23 <(git branch -a | sort) <(git branch -a --contains abcdefg1234 | sort)

这将为您提供所有没有提交 abcdefg1234 的分支; 它是 git branch -a 输出减去 git branch -a --contains abcdefg1234 输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接