【问题标题】:How to list branches that contain a given commit?如何列出包含给定提交的分支?
【发布时间】:2010-11-28 00:34:45
【问题描述】:

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

【问题讨论】:

标签: git version-control


【解决方案1】:

来自git-branch manual page

 git branch --contains <commit>

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


 git branch -r --contains <commit>

还列出 remote tracking branches(如下面的user3941992answer 中所述)是“与远程分支有直接关系的本地分支”。


作为noted by Carl Walsh,这仅适用于default refspec

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

如果您需要包含其他 ref 命名空间(pull requestGerrit、...),则需要添加新的 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

注意:如果提交是在 remote tracking branch 上,请添加 -a 选项
(如MichielBcmetsbelow

git branch -a --contains <commit>

MatrixFrog cmets 它只显示哪些分支包含该确切提交。
如果您想知道哪些分支包含“等效”提交(即哪些分支已经挑选了该提交),那就是 git cherry

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

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

(这里,标记为“-”的提交不会以git cherry 显示,这意味着它们已经存在于&lt;upstream&gt;。)

【讨论】:

  • testsmaster - master 是当前分支,因此是星号。
  • 这仅显示哪些分支包含确切的提交。如果你想知道哪些分支包含一个“等效”提交(即哪些分支已经选择了那个提交),即git cherry:“因为 git cherry 比较的是变更集而不是提交 id (sha1),所以你可以使用 git cherry找出您在本地进行的提交是否已在不同的提交 ID 下应用 。例如,如果您通过电子邮件提供补丁 而不是直接推送或拉取提交,则会发生这种情况。 kernel.org/pub/software/scm/git/docs/git-cherry.html
  • 添加-a 参数也可以检查远程分支。
  • 你也可以git tag --contains &lt;commit&gt;。见Searching for all tags that contain a commit?
  • 对于git cherry 部分@UpAndAdam 在这里提出了这个问题:stackoverflow.com/questions/16304574/…,唉,这个问题(还没有)得到回答。
【解决方案2】:

你可以跑:

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 log &lt;SHA1&gt;..master --ancestry-path --merges --oneline | tail -n1 将其放在一行中
  • 如果你想使用纯 git 命令,你可以使用:git log &lt;SHA1&gt;..master --ancestry-path --merges --oneline -1
  • 注意:当您的提交 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 到 repo root 并运行git config submodule.src/foo/submodule.branch。你也可以使用超级项目当前的 git 分支。
  • 顺便说一句:git config submodule.src/foo/submodule.branch 可以受到任何种类的 git 配置的影响,包括 repo-local .gitconfig 文件。 (需要运行git config --local include.path ./path/to/your/.gitconfig
【解决方案3】:

git branch -r --contains &lt;commit&gt; 的答案适用于普通远程分支,但如果提交仅在 GitHub creates for PRs 的隐藏 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/*

This gist 有更多上下文。)

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

【讨论】:

  • 好点。赞成。我已经在我的参考了你的答案。
  • @VonC 感谢您改进我的回答!我没有意识到我在做git commit --add
猜你喜欢
  • 2016-05-02
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多