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


当前回答

git分支的答案-r——contains <commit>适用于普通的远程分支,但如果提交只是在GitHub为PRs创建的隐藏头部名称空间中,您将需要更多的步骤。

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

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

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

(这个要点有更多的背景。)

然后当你git取回你会得到所有的PR分支,当你运行git branch -r——contains <commit>你会看到origin/ PR /42包含提交。

其他回答

从git-branch手册页:

 git branch --contains <commit>

只列出包含指定提交的分支(如果没有指定HEAD)。意味着——列表。


 git branch -r --contains <commit>

还列出了远程跟踪分支(如下面user3941992的回答中提到的),即“与远程分支有直接关系的本地分支”。


正如Carl Walsh所指出的,这只适用于默认的refspec

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

如果你需要包含其他ref命名空间(pull request, Gerrit,…),你需要添加新的refspec,并再次获取:

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

参见这篇git ready文章。

——contains标记将判断某个提交是否已被带入分支。也许您已经从您认为已经应用的补丁中获得了一个提交SHA,或者您只是想检查您最喜欢的开源项目的提交是否已经完成,该项目减少了75%的内存使用。

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

注意:如果提交是在远程跟踪分支上,添加-a选项。 (MichielB评论如下)

git branch -a --contains <commit>

MatrixFrog指出,它只显示哪些分支包含确切的提交。 如果你想知道哪些分支包含一个“等价”的提交(即哪些分支已经选择了该提交),那就是git cherry:

因为git cherry比较的是变更集而不是提交id (sha1),所以你可以使用git cherry来找出你在本地所做的提交是否在不同的提交id下被应用了<upstream>。 例如,如果您通过电子邮件提供补丁<upstream>,而不是直接推送或拉出提交,就会发生这种情况。

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

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

你可以跑:

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

从输出中上次提交的注释中,您可以找到原始的分支名称

例子:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master

git分支的答案-r——contains <commit>适用于普通的远程分支,但如果提交只是在GitHub为PRs创建的隐藏头部名称空间中,您将需要更多的步骤。

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

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

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

(这个要点有更多的背景。)

然后当你git取回你会得到所有的PR分支,当你运行git branch -r——contains <commit>你会看到origin/ PR /42包含提交。