git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: `Git Status`-like output for two local branches

From
Jeff King <peff@peff.net>
Date
Sep 2, 2009, 07:57 UTC
Message-ID
<20090902075713.GA1832@coredump.intra.peff.net>
In-Reply-To
<c115fd3c0908311320q46d585d2v457ccd0f411a6404@mail.gmail.com>
On Mon, Aug 31, 2009 at 04:20:47PM -0400, Tim Visher wrote:
Show 5 quoted lines
> I'm interested in being able to get a message such as 'dev and master
> have diverged, having 1 and 2 commits different respectively' or 'dev
> is behind master by 3 commits and can be fast-forwarded', etc.  I'm
> sure this is simple, but I can't figure out how to do it in the docs.
> Sorry for the noobness of the question.

No, there isn't a simple command to say "show me this status text for these two arbitrary branches".

However, the process is relatively simple to implement in a shell script:

  1. Pick your two branches. I'm not clear on whether you want to
     compare two arbitrary branches, or what.
     For the regular "status", one is the current branch, and the other
     is the "upstream" branch (as configured by your
     branch.$current.merge variables). Calculating "upstream" can
     actually be a bit tricky because it involves looking at several
     configuraiton variables. However, recent versions of git allow this
     shell snippet (the 'upstream' formatter was added in v1.6.3):
       current=`git symbolic-ref HEAD`
       upstream=`git for-each-ref --format='%(upstream)' $current`
  2. Count the commits on each side that are not in the other. The
     simplest way to do this is:
       in_a=`git rev-list $b..$a -- | wc -l`
       in_b=`git rev-list $a..$b -- | wc -l`
     but the internal code actually does both traversals simultaneously,
     which is slightly more efficient.  You can also do that by parsing
     the output of:
       git rev-list --left-right $a...$b --
      which will mark commits in "a" with a '<' and commits in "b" with
      a '>'. I don't know whether the extra complexity is worth the
      efficiency gain (in the internal code it is easier, since we
      aren't actually generating output and parsing it; we just keep a
      count).
  3. Compare the counts. If:
       a=0, b=0: they are the same commit
       a=0, b>0: a is behind b by $b commits, and can be fast-forwarded
       a>0, b=0: a is ahead of b by $a commits (and can be pushed, or b
                 can be fast-forwarded to a)
       a>0, b>0: branches have diverged and have $a and $b commits
                 respectively

So it's easy to script, but not exactly a one-liner. We might be able to do better if you reduce the problem space. What exactly are you trying to accomplish?

-Peff
Previous: Tim VisherNext: Sverre Rabbelier
Message 2 of 6 in “`Git Status`-like output for two local branches”
  1. Tim VisherAug 31, 2009
  2. Jeff KingSep 2, 2009
  3. Sverre RabbelierSep 2, 2009
  4. Jeff KingSep 5, 2009
  5. demerphqSep 5, 2009
  6. Jeff KingSep 9, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.