`Git Status`-like output for two local branches

6 messages, 4 authors, 2016-06-15 · open the first message on its own page

`Git Status`-like output for two local branches

From: Tim Visher <hidden>
Date: 2016-06-15 22:47:20

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

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

From: Jeff King <hidden>
Date: 2016-06-15 22:47:20

On Mon, Aug 31, 2009 at 04:20:47PM -0400, Tim Visher wrote:
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

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

From: Sverre Rabbelier <hidden>
Date: 2016-06-15 22:47:21

Heya,

On Wed, Sep 2, 2009 at 09:57, Jeff King[off-list ref] 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

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

From: Jeff King <hidden>
Date: 2016-06-15 22:47:21

On Wed, Sep 02, 2009 at 10:18:54AM +0200, Sverre Rabbelier wrote:
On Wed, Sep 2, 2009 at 09:57, Jeff King[off-list ref] wrote:
quoted
 2. Count the commits on each side that are not in the other.
[...]
quoted
     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

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

From: demerphq <hidden>
Date: 2016-06-15 22:47:21

2009/9/5 Jeff King [off-list ref]:
On Wed, Sep 02, 2009 at 10:18:54AM +0200, Sverre Rabbelier wrote:
quoted
On Wed, Sep 2, 2009 at 09:57, Jeff King[off-list ref] wrote:
quoted
 2. Count the commits on each side that are not in the other.
[...]
quoted
     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/"

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

From: Jeff King <hidden>
Date: 2016-06-15 22:47:22

On Sat, Sep 05, 2009 at 04:58:36PM +0200, demerphq wrote:
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help