【发布时间】:2010-11-28 00:34:45
【问题描述】:
如何查询 git 以找出哪些分支包含给定的提交? gitk 通常会列出分支,除非分支太多,在这种情况下,它只会显示“许多 (38)”或类似的内容。我需要知道完整列表,或者至少某些分支是否包含提交。
【问题讨论】:
-
每个 cmets 等效提交的相关问题:stackoverflow.com/questions/16304574/…
标签: git version-control
如何查询 git 以找出哪些分支包含给定的提交? gitk 通常会列出分支,除非分支太多,在这种情况下,它只会显示“许多 (38)”或类似的内容。我需要知道完整列表,或者至少某些分支是否包含提交。
【问题讨论】:
标签: git version-control
git branch --contains <commit>
仅列出包含指定提交的分支(如果未指定,则为 HEAD)。暗示
--list。
git branch -r --contains <commit>
还列出 remote tracking branches(如下面的user3941992 的answer 中所述)是“与远程分支有直接关系的本地分支”。
作为noted by Carl Walsh,这仅适用于default 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
注意:如果提交是在 remote tracking branch 上,请添加 -a 选项。
(如MichielBcmetsbelow)
git branch -a --contains <commit>
MatrixFrog cmets 它只显示哪些分支包含该确切提交。
如果您想知道哪些分支包含“等效”提交(即哪些分支已经挑选了该提交),那就是 git cherry:
因为
git cherry比较的是变更集而不是提交ID(sha1),您可以使用git cherry来确定您在本地进行的提交是否已在不同的<upstream>下应用提交 ID。
例如,如果您通过电子邮件提供补丁<upstream>而不是直接推送或拉取提交,就会发生这种情况。
__*__*__*__*__> <upstream>
/
fork-point
\__+__+__-__+__+__-__+__> <head>
(这里,标记为“-”的提交不会以git cherry 显示,这意味着它们已经存在于<upstream>。)
【讨论】:
tests 和 master - master 是当前分支,因此是星号。
git cherry:“因为 git cherry 比较的是变更集而不是提交 id (sha1),所以你可以使用 git cherry找出您在本地进行的提交是否已在不同的提交 ID 下应用 -a 参数也可以检查远程分支。
git tag --contains <commit>。见Searching for all tags that contain a commit?。
git cherry 部分@UpAndAdam 在这里提出了这个问题:stackoverflow.com/questions/16304574/…,唉,这个问题(还没有)得到回答。
你可以跑:
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 <SHA1>..master --ancestry-path --merges --oneline | tail -n1 将其放在一行中
git log <SHA1>..master --ancestry-path --merges --oneline -1
A..B 提交范围,只是不要使用这样的范围:: git log HEAD --oneline -1 > 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
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)
git branch -r --contains <commit> 的答案适用于普通远程分支,但如果提交仅在 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 <commit> 时,您将看到 origin/pr/42 包含提交。
【讨论】:
git commit --add。