From: Jeff King <peff@peff.net>
To: Tim Visher <tim.visher@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: `Git Status`-like output for two local branches
Date: Wed, 2 Sep 2009 03:57:13 -0400 [thread overview]
Message-ID: <20090902075713.GA1832@coredump.intra.peff.net> (raw)
In-Reply-To: <c115fd3c0908311320q46d585d2v457ccd0f411a6404@mail.gmail.com>
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
next prev parent reply other threads:[~2009-09-02 7:57 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-31 20:20 `Git Status`-like output for two local branches Tim Visher
2009-09-02 7:57 ` Jeff King [this message]
2009-09-02 8:18 ` Sverre Rabbelier
2009-09-05 8:17 ` Jeff King
2009-09-05 14:58 ` demerphq
2009-09-09 12:26 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090902075713.GA1832@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=tim.visher@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).