我如何查询git以找出哪些分支包含给定的提交?gitk通常会列出分支,除非有太多,在这种情况下它只是说“许多(38)”或类似的东西。我需要知道完整的列表,或者至少某些分支是否包含提交。
gitk
从git分支手册页:
git branch --contains <commit>
仅列出包含指定提交的分支(如果未指定HEAD)。暗示--list。
--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%的开源项目的提交是否还在。
--contains
$ 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>而不是直接推送或拉取提交,则会发生这种情况。
git cherry
<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命名空间中,则需要更多步骤。
head
比方说,如果PR#42来自已删除的分支,并且该PR线程对repo上的提交有唯一的引用,那么git branch -r不知道PR#42,因为像refs/pull/42/head这样的引用默认情况下不会被列为远程分支。
git branch -r
refs/pull/42/head
在.git/config中,为[remote "origin"]部分添加新行:
.git/config
[remote "origin"]
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
(这个要点有更多上下文。)
然后,当您git fetch时,您将获得所有PR分支,当您运行git branch -r --contains <commit>时,您将看到origin/pr/42包含提交。
git fetch
origin/pr/42