git log --branches命令有效吗?

45

我似乎无法正确筛选git log --branches的输出。看起来好像Git忽略了它。

例如,运行git log --graph --all --decorate的头部打印:

* commit 3ae0d17538f787bdde68f37f6644ffe9652d8dc1 (HEAD, feature/branch-ignore)
| Author: Chris Lewis <chris@chris.to>
| Date:   Mon Mar 14 17:39:56 2011 -0700
| 
|     Ignore merge commits, as they're going to be duplicating events
|  
* commit 770534e9d77acb03eaf842440c879aec1c5b5500
| Author: Chris Lewis <chris@chris.to>
| Date:   Tue Mar 8 14:39:40 2011 -0800
| 
|     Removed another remote branch check
| 

假设我想要按master筛选,这应该意味着这些提交将被忽略。 git log --graph --all --decorate --branches=master的顶部也是:

* commit 3ae0d17538f787bdde68f37f6644ffe9652d8dc1 (HEAD, feature/branch-ignore)
| Author: Chris Lewis <chris@chris.to>
| Date:   Mon Mar 14 17:39:56 2011 -0700
| 
|     Ignore merge commits, as they're going to be duplicating events
|  
* commit 770534e9d77acb03eaf842440c879aec1c5b5500
| Author: Chris Lewis <chris@chris.to>
| Date:   Tue Mar 8 14:39:40 2011 -0800
| 
|     Removed another remote branch check
|  

Git似乎没有过滤。传递--branches参数或不传递任何参数似乎都没有区别。我的Git版本是git version 1.7.4.1。有人知道如何成功使用此命令吗?

编辑:我想要的就是能够获取一条分支或另一条分支的日志,而无需先进行checkout。


2
有趣的问题。到目前为止,下面的评论都没有涉及 --branches 应该做什么或者它应该如何工作。 - Steve Bennett
1
我已经添加了一个答案,现在解释了为什么它能够正确工作,即使它看起来不是这样。 - Adam Spiers
5个回答

27

首先,(其他的)Adam是对的,使用--all在这种情况下是没有意义的:如果你只想看一个分支(如你的问题所述),那么为什么要请求所有分支呢?

其次,正如其他答案的评论中已经提到的,你不需要使用--branches;只需执行git log mybranch即可。

第三,我可以解释为什么git log --branches=mybranch不能起作用。 git-log(1)手册页上写道:

--branches[=<pattern>]
    Pretend as if all the refs in refs/heads are listed on
    the command line as <commit>. If <pattern> is given, 
    limit branches to ones matching given shell glob. If 
    pattern lacks ?, *, or [, /* at the end is implied.

这里的关键点在于最后一句话。如果<pattern>只是mybranch,那么它就没有通配符,所以git-log会将其解释为你输入了:

git log --branches=mybranch/*

这个模式只匹配以mybranch/开头的引用,即$repo/.git/refs/heads/mybranch/*下的分支。

有一个肮脏的技巧可以防止假定/*

git log --branches=[m]ybranch

但我想不出为什么你要这样做而不是直接打字。

git log mybranch

1
那么它只是一个分支(git log mybranch)或所有分支。如果您想要两个分支,该怎么办?--branches,人们会认为这是做到这一点的方法。那是什么? - Emmel
3
这个命令是查看两个分支(branch1和branch2)的提交记录。 - Adam Spiers
1
我觉得很有趣,尽管官方文档中的“git log”几乎有10万个字符,但似乎没有提到“git log branch”的存在。https://git-scm.com/docs/git-log - Neutrino
@Neutrino,你正在寻找<revision range>部分。 - Phu Ngo
1
"<revision range> 仅显示指定修订范围内的提交。该部分未提及分支。" - Neutrino

15

因为您指定了--all,所以您覆盖了任何分支规范。


5
在我看来,缺乏警告似乎是一个可用性方面的错误。 - nes1983
2
正如我在问题中提到的那样,使用其他标志似乎没有任何区别。git log --branches=master返回相同的提交记录(显然格式不同)。它就是无法工作。 - cflewis
3
如果你只需要主分支的提交记录,可以使用命令 git log master。请注意,本文仅涉及翻译,不包括解释或其他内容。 - Cascabel

11
假设您的历史记录如下:
  d -- e [refs/tags/release1]
 /
a -- b -- c [refs/heads/master]
      \
       f -- g [refs/heads/dev1]
        \
         h [refs/heads/dev2]

如果你执行git log --branches,它和git log master dev1 dev2是一样的,所以你会看到提交a、b、c、f、g和h。如果你执行git log release1 --branches=dev*,它和git log release1 dev1 dev2是一样的。你会看到提交a、d、e、b、f、g和h,但不包括c。

2
这个例子 git log master dev1 dev2 很有帮助。谢谢! - Hoonerbean

4

--branches解释

git log <commit>会列出所有可以从命令行输入的任何<commit>到达的提交。

  • --all执行相同的操作,但假装您列出了refs/中的所有引用。

  • --branches[=<pattern>]执行相同的操作,但假装您列出了refs/heads中的所有分支。它还允许您使用glob模式限制。作为一个要点,如果您的glob模式缺少?,[,则在结尾处隐含一个/

示例

git log topic1 topic2 topic3

意味着列出所有可以从topic1topic2topic3到达的提交。

git log -all

意味着列出所有可以从git show-ref输出的引用到达的提交。

git log --branches="topic*"

意味着列出所有可以从以前缀topic开始的任何分支到达的提交。

来源

https://schacon.github.io/git/git-log.html

https://schacon.github.io/git/git-rev-list.html


3
有人知道如何成功使用这条命令吗?
编辑:我只想获取一个分支或另一个分支的日志,而不必先进行检出。

为了可视化所有分支和远程提交记录的图形,请执行以下操作:

$ git log --graph --branches=* --remotes=* --decorate

结合其他git-log选项使用,以控制详细程度,例如:--oneline--name-status等。

您可能需要先获取远程更改才能看到它们。您可以像这样获取所有远程更改,而不将其应用于当前分支:

$ git fetch --all

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接