Does git log --branches work?

前端 未结 5 975
北荒
北荒 2020-12-28 12:44

I can\'t seem to get git log --branches to correctly filter its output. It seems as if Git ignores it.

For example, the head of git log --graph --

相关标签:
5条回答
  • 2020-12-28 13:14

    Because you specified --all, you override any branch specifications you made.

    0 讨论(0)
  • 2020-12-28 13:16

    Firstly, (the other) Adam is right that it doesn't make sense to use --all for this: if you only want to see one branch like your question states, why ask for all branches?

    Secondly, as already stated in comments to other answers, you don't need --branches; just do git log mybranch.

    Thirdly, I can explain why git log --branches=mybranch doesn't work. The git-log(1) man page says:

    --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.
    

    The last sentence is the crucial point here. If the <pattern> is just mybranch then there is no globbing character, so git-log interprets it as if you'd typed

    git log --branches=mybranch/*
    

    which only matches references under $repo/.git/refs/heads/mybranch/*, i.e. branches which begin with mybranch/.

    There is a dirty hack to prevent the /* from being assumed:

    git log --branches=[m]ybranch
    

    but I can't think of any good reason why you would want to do this rather than just typing

    git log mybranch
    
    0 讨论(0)
  • 2020-12-28 13:26

    Explanation of --branches

    git log <commit> lists all commits that are reachable from any <commit> that you list on the command line.

    • --all does the same but pretends that you listed all the refs in refs/.

    • --branches[=<pattern>] does the same but pretends that you listed all the refs in refs/heads. It also allows you to limit with a glob pattern. As a gotcha, if your glob pattern lacks ?, , or [, then an / at the end is implied.

    Examples

    git log topic1 topic2 topic3

    means list all the commits reachable from topic1, topic2, or topic3.

    git log -all

    means list all the commits that are reachable from any of the refs that are output from git show-ref.

    git log --branches="topic*"

    means list all the commits that are reachable from from any branch that starts with the prefix topic.

    Sources

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

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

    0 讨论(0)
  • 2020-12-28 13:29

    Does anyone know how to use this command successfully?

    EDIT: All I want to be able to do is get the log of one branch or another, without having to do a checkout first.

    In order to visualise the graph of commits on all branches and remotes do this:

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

    Use this with other git-log options to control verbosity, e.g. --oneline, --name-status, etc.

    You may have to fetch remote changes first in order to see them. You can fetch all remote changes without applying them to your current branch(es) like this:

    $ git fetch --all
    
    0 讨论(0)
  • 2020-12-28 13:39

    Let's say your history looked like this

      d -- e [refs/tags/release1]
     /
    a -- b -- c [refs/heads/master]
          \
           f -- g [refs/heads/dev1]
            \
             h [refs/heads/dev2]
    

    If you do git log --branches it's the same git log master dev1 dev2, so you'll see commits a,b,c,f,g and h. If you did git log release1 --branches=dev* it's the same as git log release1 dev1 dev2. You'll see a,d,e,b,f,g, and h, but not c.

    0 讨论(0)
提交回复
热议问题