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

And*_*ott 1029 git version-control

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

Von*_*onC 1402

git-branch手册页:

 git branch --contains <commit>
Run Code Online (Sandbox Code Playgroud)

仅列出包含指定提交的分支(如果未指定,则为HEAD).意味着--list.


 git branch -r --contains <commit>
Run Code Online (Sandbox Code Playgroud)

列出远程跟踪分支(如下面的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
Run Code Online (Sandbox Code Playgroud)

注意:如果提交位于远程跟踪分支上,请添加该-a选项.
(正如MichielB 在下面评论)

git branch -a --contains <commit>
Run Code Online (Sandbox Code Playgroud)

MatrixFrog注释它只显示哪些分支包含那个确切的提交.
如果你想知道哪些分支包含"等效"提交(即哪些分支已经选择了提交),那就是git cherry:

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

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>
Run Code Online (Sandbox Code Playgroud)

(这里,标记' -' 的提交不会显示git cherry,意味着它们已经存在<upstream>.)

  • 添加`-a`参数也可以检查远程分支. (59认同)
  • 这只显示哪些分支包含*精确提交*.如果你想知道哪些分支包含"等效"提交(即哪些分支已经选择了提交),那就是`git cherry`:"因为git cherry比较变更集而不是提交id(sha1),你可以使用git如果您在本地提交的提交已经在不同的提交ID下应用<upstream>,那么可能会发生这种情况.例如,如果您通过电子邮件提供补丁<upstream>而不是直接推送或提取提交,则会发生这种情况." http://www.kernel.org/pub/software/scm/git/docs/git-cherry.html (51认同)
  • 你也可以做`git tag --contains <commit>`.请参阅[搜索包含提交的所有标记?](http://stackoverflow.com/questions/7923091/searching-for-all-tags-that-c​​ontain-a-commit). (27认同)
  • 对于`git cherry`部分@UpAndAdam在这里问了这个问题:http://stackoverflow.com/questions/16304574/how-to-list-branches-that-c​​ontain-an-equivalent-commit,唉,问题还没有(还)得到了答复. (4认同)
  • `tests`和`master` - `master`是当前分支,因此是星号. (3认同)
  • 这个答案对我来说不起作用,但是当我发现我需要做`git branch -a --contains <commit>`时就做了.它在遥控器的一个分支 - 你可以更新你的答案吗? (2认同)

Eug*_*kov 20

你可以运行:

git log <SHA1>..HEAD --ancestry-path --merges
Run Code Online (Sandbox Code Playgroud)

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

例:

       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
Run Code Online (Sandbox Code Playgroud)

  • 太好了!我用`git log <SHA1> .. master --ancestry-path --merges --oneline | 尾巴-n1`把它放在一行 (6认同)