如何列出包含给定提交的分支?

我如何查询git以找出哪些分支包含给定的提交?gitk通常会列出分支,除非有太多,在这种情况下它只是说“许多(38)”或类似的东西。我需要知道完整的列表,或者至少某些分支是否包含提交。

360940 次浏览

git分支手册页

 git branch --contains <commit>

仅列出包含指定提交的分支(如果未指定HEAD)。暗示--list


 git branch -r --contains <commit>

还列出远程跟踪分支(如下面user3941992回答所述),它是“与远程分支有直接关系的本地分支”。


作为注意 bycarlwalsh,这仅适用于默认引用规范

fetch = +refs/heads/*:refs/remotes/origin/*

如果您需要包含其他ref命名空间(拉取请求Gerrit,…),则需要添加新的refspec,然后再次获取:

git config --add remote.origin.fetch "+refs/pull/*/head:refs/remotes/origin/pr/*"git fetchgit branch -r --contains <commit>

请参阅此git就绪文章。

--contains标签将确定某个提交是否已被带入您的分支。也许您已经从您认为已经应用的补丁中获得了提交SHA,或者您只是想检查您最喜欢的将内存使用减少75%的开源项目的提交是否还在。

$ git log -1 testscommit d590f2ac0635ec0053c4a7377bd929943d475297Author: Nick Quaranto <nick@quaran.to>Date:   Wed Apr 1 20:38:59 2009 -0400
Green all around, finally.
$ git branch --contains d590f2tests* master

注意:如果提交在远程跟踪分支上,添加#0选项.
MichielB评论下面

git branch -a --contains <commit>

MatrixFrog注释它只显示哪些分支包含确切提交。
如果你想知道哪些分支包含“等价”提交(即哪些分支选择了该提交),那就是#0

因为git cherry比较变更集而不是提交ID(sha1),您可以使用git cherry来确定您在本地进行的提交是否已在不同的提交ID下应用<upstream>
例如,如果您通过电子邮件提供补丁<upstream>而不是直接推送或拉取提交,则会发生这种情况。

           __*__*__*__*__> <upstream>/fork-point\__+__+__-__+__+__-__+__> <head>

(在这里,标记为“-”的提交不会出现在git cherry中,这意味着它们已经存在于<upstream>中。

您可以运行:

git log <SHA1>..HEAD --ancestry-path --merges

从输出中最后一次提交的注释中,您可以找到原始分支 name

示例:

       c---e---g--- feature/         \-a---b---d---f---h---j--- master
git log e..master --ancestry-path --merges
commit hMerge: g fAuthor: Eugen Konkov <>Date:   Sat Oct 1 00:54:18 2016 +0300
Merge branch 'feature' into master

git branch -r --contains <commit>的答案适用于普通的远程分支,但如果提交仅在GitHub为PR创建的隐藏head命名空间中,则需要更多步骤。

比方说,如果PR#42来自已删除的分支,并且该PR线程对repo上的提交有唯一的引用,那么git branch -r不知道PR#42,因为像refs/pull/42/head这样的引用默认情况下不会被列为远程分支。

.git/config中,为[remote "origin"]部分添加新行:

fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

这个要点有更多上下文。)

然后,当您git fetch时,您将获得所有PR分支,当您运行git branch -r --contains <commit>时,您将看到origin/pr/42包含提交。