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


1087

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



每个评论的等效提交的相关问题:stackoverflow.com/questions/16304574/…–
UpAndAdam

Answers:


1470

git-branch手册页

 git branch --contains <commit>

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


 git branch -r --contains <commit>

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


另请参阅这篇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来查找是否<upstream>在不同的提交ID下应用了在本地进行的提交。
例如,如果您<upstream>通过电子邮件提供补丁程序,而不是直接推送或提取提交,则会发生这种情况。

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

(此处,标记为' -' 的提交不会出现git cherry,表示它们已经存在于中<upstream>。)


3
testsmaster- master是当前分支,因此星号。
2011年

54
这仅显示哪些分支包含该确切的提交。如果您想知道哪些分支包含一个“等效”提交(即哪些分支已经选择了该提交),即git cherry:“因为git cherry比较更改集而不是提交ID(sha1),因此可以使用git cherry来查找如果您在本地进行的提交已在不同的提交ID下应用了<upstream>。例如,如果您通过电子邮件提供<upstream>补丁,而不是直接推送或提取提交,则会发生这种情况。” kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog 2011年

62
添加-a参数还可以检查远程分支。
拉曼2012年

28
您也可以git tag --contains <commit>。请参阅搜索包含提交的所有标签?
Andrew Marshall

5
对于git cherry@UpAndAdam部分,在这里提出了一个问题:stackoverflow.com/questions/16304574 / ...,a,这个问题(尚未)得到了回答。
2014年

22

您可以运行:

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

6
真好!我曾经git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1把它放在一行中
James EJ

1
如果您想使用纯git命令,则可以使用:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz

注意:当您的提交sha是master / foo分支(HEAD)上的最新提交...时,您将无法执行A..B提交范围,只是不要使用如下范围:: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message
德文·罗德

如果此git repo是子模块,并且您正在尝试解决分离的HEAD问题...那么您会遇到一个首选分支的难题...在我之前的示例中,您可以轻松地说,master如果它在此列表中,则总是首选。从那里还不清楚。你可以尝试和读取.gitmodules文件的Git分支:git config -f .gitmodules submodule.src/foo/submodule.branch。这可能是一个长期存在的叉子/公关。您可以使用cd重新获得root权限并运行git config submodule.src/foo/submodule.branch。您也可以使用superprojects当前的git分支。
德文·罗德

git config submodule.src/foo/submodule.branch顺便说一句:可以受各种git配置影响,包括repo-local .gitconfig文件。(需要跑步git config --local include.path ./path/to/your/.gitconfig
Devin G Rhode
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.