threads / discuss / 20802

`Git Status`-like output for two local branches

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

## tl;dr

6 messages between Aug 31, 2009 and Sep 9, 2009.

replies: 5people: 4as markdown or json

Tim Visher· Aug 31, 2009, 20:20 UTC · lore
Hello Everyone,

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.

Thanks!
-- 
In Christ,

Timmy V.

http://burningones.com/
http://five.sentenc.es/ - Spend less time on e-mail
Jeff King· Sep 2, 2009, 07:57 UTC · re: Tim Visher · lore

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

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
Sverre Rabbelier· Sep 2, 2009, 08:18 UTC · re: Jeff King · lore

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

Heya,
On Wed, Sep 2, 2009 at 09:57, Jeff King<peff@peff.net> wrote:
>  2. Count the commits on each side that are not in the other.
[...]
>      You can also do that by parsing the output of:
>       git rev-list --left-right $a...$b --
Perhaps it is useful to introduce a --left-right-count or such?
-- 
Cheers,

Sverre Rabbelier
Jeff King· Sep 5, 2009, 08:17 UTC · re: Sverre Rabbelier · lore

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

On Wed, Sep 02, 2009 at 10:18:54AM +0200, Sverre Rabbelier wrote:
Show 9 quoted lines
> On Wed, Sep 2, 2009 at 09:57, Jeff King<peff@peff.net> wrote:
> >  2. Count the commits on each side that are not in the other.
> 
> [...]
> 
> >      You can also do that by parsing the output of:
> >       git rev-list --left-right $a...$b --
> 
> Perhaps it is useful to introduce a --left-right-count or such?

I'm not opposed to that if it is something a lot of people found useful, but I am not sure we have established that as the case (I am curious to hear from Tim what his actual use case is).

-Peff
demerphq· Sep 5, 2009, 14:58 UTC · re: Jeff King · lore

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

2009/9/5 Jeff King <peff@peff.net>:
Show 15 quoted lines
> On Wed, Sep 02, 2009 at 10:18:54AM +0200, Sverre Rabbelier wrote:
>
>> On Wed, Sep 2, 2009 at 09:57, Jeff King<peff@peff.net> wrote:
>> >  2. Count the commits on each side that are not in the other.
>>
>> [...]
>>
>> >      You can also do that by parsing the output of:
>> >       git rev-list --left-right $a...$b --
>>
>> Perhaps it is useful to introduce a --left-right-count or such?
>
> I'm not opposed to that if it is something a lot of people found useful,
> but I am not sure we have established that as the case (I am curious to
> hear from Tim what his actual use case is).

It would be useful in for instance prompt status line. At $work we have a number of people using a prompt that includes the result of parsing git-status, but something --left-right-count would be much nicer, and if i understand it, more efficient (although maybe im wrong). In the prompt they use a number of different unicode arrows to show what has happened, with a Y type thing for diverged.

cheers, Yves

-- 
perl -Mre=debug -e "/just|another|perl|hacker/"
Jeff King· Sep 9, 2009, 12:26 UTC · re: demerphq · lore

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

On Sat, Sep 05, 2009 at 04:58:36PM +0200, demerphq wrote:
Show 6 quoted lines
> It would be useful in for instance prompt status line. At $work we
> have a number of people using a prompt that includes the result of
> parsing git-status, but something --left-right-count would be much
> nicer, and if i understand it, more efficient (although maybe im
> wrong). In the prompt they use a number of different unicode arrows to
> show what has happened, with a Y type thing for diverged.

Well, if they are using the other bits of "git status" then it may not be that inefficient compared to a "--left-right-count".

However, it sounds like they are not actually interested in the count, but just the two bits of information: is A ahead of B, and is B ahead of A (and then displaying one of four symbols as a result).

And getting that information is even more efficient than just a count, because you don't have to traverse all of the commits. Though you do still have to find the merge base, so I'm not sure how much you would be saving in practice.

A "--left-right-count" does feel like an odd option to "git log" or "git rev-list", as you are no longer logging or listing anything. In a way, it makes more sense to me as a special output format of "git merge-base".

Anyway, I think your example sounds like a reasonable application. Personally, I do not use a git-enhanced prompt, so it is not my itch to scratch (and I think a plumbing patch would only make sense if it was a stepping stone to an actual application, which means somebody needs to write the actual application).

-Peff

← back to recent threads