# Specifying N revisions after the initial commit

7 messages from 2015-09-22 to 2015-09-22. Participants: Josh Boyer, Konstantin Khomoutov, Junio C Hamano, Theodore Ts'o.
Thread: https://gitlist.dev/t/40403

## Josh Boyer, 2015-09-22 18:32

Subject: Specifying N revisions after the initial commit
Message-ID: <CA+5PVA40x8bxW63X+b77FDO8btRBaVOg=fq+ZyX=bdJ+uEm9gA@mail.gmail.com>
URL: https://gitlist.dev/e/CA%2B5PVA40x8bxW63X%2Bb77FDO8btRBaVOg%3Dfq%2BZyX%3DbdJ%2BuEm9gA%40mail.gmail.com

```
Hi All,

Please CC me as I'm not subscribed.

I was hoping someone could help me with the revision shorthand to get
the commit sha of a commit N commits after the initial commit.  Thus
far I've figured out that to get the initial commit in a repository,
you can use:

git rev-list --max-parents=0 HEAD

but I can't figure out how to get "give me the commit sha1 of the
commit immediately after the initial commit", or for some number N.  I
could always do something like:

git rev-list HEAD | tail -2

to get both, but I was curious if there was a refspec shorthand for
this that could be used.  It seems that git's rev parsing is all built
on going backwards in order (and probably rightfully so).

Thanks in advance.

josh

```

## Konstantin Khomoutov, 2015-09-22 18:40

Subject: Re: Specifying N revisions after the initial commit
Message-ID: <20150922214037.b6b48059f051fcd4060a5a85@domain007.com>
URL: https://gitlist.dev/e/20150922214037.b6b48059f051fcd4060a5a85%40domain007.com
In-Reply-To: <CA+5PVA40x8bxW63X+b77FDO8btRBaVOg=fq+ZyX=bdJ+uEm9gA@mail.gmail.com>

```
On Tue, 22 Sep 2015 14:32:19 -0400
Josh Boyer <jwboyer@gmail.com> wrote:

> Please CC me as I'm not subscribed.
> 
> I was hoping someone could help me with the revision shorthand to get
> the commit sha of a commit N commits after the initial commit.

What happens if right after the initial commit, there have been five
branches created -- with no common commits except for the initial one?

That's the core limitation of the data model Git uses (and arguably any
other DVCS system): all commits form a directed acyclic graph.
The "directed" in that construct means that child commits contain a
link to their parent commit (or commits) but not vice-versa.

Hence, given any particular commit, you're able to trace all of its
ancestry, but the reverse is not possible.

```

## Josh Boyer, 2015-09-22 19:10

Subject: Re: Specifying N revisions after the initial commit
Message-ID: <CA+5PVA6YWJizRjseeJ4EpRya0Mpyrv3DoNsB3=Gi=dOiAoDfHg@mail.gmail.com>
URL: https://gitlist.dev/e/CA%2B5PVA6YWJizRjseeJ4EpRya0Mpyrv3DoNsB3%3DGi%3DdOiAoDfHg%40mail.gmail.com
In-Reply-To: <20150922214037.b6b48059f051fcd4060a5a85@domain007.com>

```
On Tue, Sep 22, 2015 at 2:40 PM, Konstantin Khomoutov
<kostix+git@007spb.ru> wrote:
> On Tue, 22 Sep 2015 14:32:19 -0400
> Josh Boyer <jwboyer@gmail.com> wrote:
>
>> Please CC me as I'm not subscribed.
>>
>> I was hoping someone could help me with the revision shorthand to get
>> the commit sha of a commit N commits after the initial commit.
>
> What happens if right after the initial commit, there have been five
> branches created -- with no common commits except for the initial one?
>
> That's the core limitation of the data model Git uses (and arguably any
> other DVCS system): all commits form a directed acyclic graph.
> The "directed" in that construct means that child commits contain a
> link to their parent commit (or commits) but not vice-versa.

Hm.  It has been so long since I've looked at the underlying model and
git has proven to be so flexible on such a variety of things that I
guess I forgot it was constructed through a DAG.  The --reverse
parameter to git-log and git-rev-parse had left me hopeful.

> Hence, given any particular commit, you're able to trace all of its
> ancestry, but the reverse is not possible.

That makes sense.  I suppose I will have to resort to parsing output
of git-rev-list or something.  Thanks for the reminder.

josh

```

## Junio C Hamano, 2015-09-22 19:55

Subject: Re: Specifying N revisions after the initial commit
Message-ID: <xmqqpp1a2pql.fsf@gitster.mtv.corp.google.com>
URL: https://gitlist.dev/e/xmqqpp1a2pql.fsf%40gitster.mtv.corp.google.com
In-Reply-To: <CA+5PVA6YWJizRjseeJ4EpRya0Mpyrv3DoNsB3=Gi=dOiAoDfHg@mail.gmail.com>

```
Josh Boyer <jwboyer@gmail.com> writes:

> On Tue, Sep 22, 2015 at 2:40 PM, Konstantin Khomoutov
> ...
>> Hence, given any particular commit, you're able to trace all of its
>> ancestry, but the reverse is not possible.
>
> That makes sense.  I suppose I will have to resort to parsing output
> of git-rev-list or something.  Thanks for the reminder.

I think Konstantin explained why it fundamentally does not make
sense to ask "which one is the Nth one after the root".  I am not
sure how running rev-list and count its output would help, unless
you are now solving a different problem (perhaps "find all the ones
that are Nth after some root", which does have an answer).

```

## Josh Boyer, 2015-09-22 20:11

Subject: Re: Specifying N revisions after the initial commit
Message-ID: <CA+5PVA6zUXGs2R-MOoj5sBxwUqM7HP=tx-0WZJzPf71MsjH9MA@mail.gmail.com>
URL: https://gitlist.dev/e/CA%2B5PVA6zUXGs2R-MOoj5sBxwUqM7HP%3Dtx-0WZJzPf71MsjH9MA%40mail.gmail.com
In-Reply-To: <xmqqpp1a2pql.fsf@gitster.mtv.corp.google.com>

```
On Tue, Sep 22, 2015 at 3:55 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Josh Boyer <jwboyer@gmail.com> writes:
>
>> On Tue, Sep 22, 2015 at 2:40 PM, Konstantin Khomoutov
>> ...
>>> Hence, given any particular commit, you're able to trace all of its
>>> ancestry, but the reverse is not possible.
>>
>> That makes sense.  I suppose I will have to resort to parsing output
>> of git-rev-list or something.  Thanks for the reminder.
>
> I think Konstantin explained why it fundamentally does not make
> sense to ask "which one is the Nth one after the root".  I am not
> sure how running rev-list and count its output would help, unless
> you are now solving a different problem (perhaps "find all the ones
> that are Nth after some root", which does have an answer).

Oh, context would help, yes.  In the case of the tree I'm parsing, I
know for a fact that the commit history is entirely linear and will
(should) always remain so.  E.g.

A - B - C - D - E - F ... {N}

So yes, finding e.g. the second commit after the root is complicated
for something resembling anything like a typical git repo, but this
isn't like that.  In other words, I can cheat.  Or at least I'm pretty
sure I can cheat :).

josh

```

## Theodore Ts'o, 2015-09-22 20:40

Subject: Re: Specifying N revisions after the initial commit
Message-ID: <20150922204000.GC3318@thunk.org>
URL: https://gitlist.dev/e/20150922204000.GC3318%40thunk.org
In-Reply-To: <CA+5PVA6zUXGs2R-MOoj5sBxwUqM7HP=tx-0WZJzPf71MsjH9MA@mail.gmail.com>

```
On Tue, Sep 22, 2015 at 04:11:23PM -0400, Josh Boyer wrote:
> Oh, context would help, yes.  In the case of the tree I'm parsing, I
> know for a fact that the commit history is entirely linear and will
> (should) always remain so.  E.g.
> 
> A - B - C - D - E - F ... {N}
> 
> So yes, finding e.g. the second commit after the root is complicated
> for something resembling anything like a typical git repo, but this
> isn't like that.  In other words, I can cheat.  Or at least I'm pretty
> sure I can cheat :).

I'd suggest making your script makes sure "git rev-list --merges A..N"
doesn't output any commits, so you know for sure that the commit
history is linear.  That way you'll be certain that you can cheat.  :-)

	   	    	     	    - Ted

```

## Junio C Hamano, 2015-09-22 20:42

Subject: Re: Specifying N revisions after the initial commit
Message-ID: <xmqq1tdq2nkd.fsf@gitster.mtv.corp.google.com>
URL: https://gitlist.dev/e/xmqq1tdq2nkd.fsf%40gitster.mtv.corp.google.com
In-Reply-To: <20150922204000.GC3318@thunk.org>

```
Theodore Ts'o <tytso@mit.edu> writes:

> On Tue, Sep 22, 2015 at 04:11:23PM -0400, Josh Boyer wrote:
>> Oh, context would help, yes.  In the case of the tree I'm parsing, I
>> know for a fact that the commit history is entirely linear and will
>> (should) always remain so.  E.g.
>> 
>> A - B - C - D - E - F ... {N}
>> 
>> So yes, finding e.g. the second commit after the root is complicated
>> for something resembling anything like a typical git repo, but this
>> isn't like that.  In other words, I can cheat.  Or at least I'm pretty
>> sure I can cheat :).
>
> I'd suggest making your script makes sure "git rev-list --merges A..N"
> doesn't output any commits, so you know for sure that the commit
> history is linear.  That way you'll be certain that you can cheat.  :-)

There are histories with multiple roots without any merges, in which
case you cannot ;-)

```
