accessing oldest reflog entry with ref@{N}?

2013-06-19 Thread SZEDER Gábor
Hi,

after a couple of months of inactivity I recently updated my git clone
from the main repo, and later ran 'git gc', which, of course,
dutifully pruned the old reflog entries, leaving my reflogs quite
shallow:

$ git reflog master
0dbd8125 master@{0}: merge origin/master: Fast-forward
f3828dc0

Then later I had to access the previous state, which I usually do with
master@{1}, but not this time:

$ git log --oneline -1 master@{1}
fatal: Log for 'master' only has 1 entries.

Annoyed, I just copy-pasted the sha and got the job done.

However, I wonder why it didn't worked.  'git reflog' didn't print
master@{1} or any message for the oldest entry, but I can live without
that.  The sha is undoubtedly there, however, so git should know where
master@{1} points and should Just Work, shouldn't it?


Thanks,
Gábor

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: accessing oldest reflog entry with ref@{N}?

2013-06-19 Thread Junio C Hamano
SZEDER Gábor sze...@ira.uka.de writes:

 $ git log --oneline -1 master@{1}
 fatal: Log for 'master' only has 1 entries.

 Annoyed, I just copy-pasted the sha and got the job done.

 However, I wonder why it didn't worked. 'git reflog' didn't print
 master@{1} or any message for the oldest entry, but I can live without
 that.

There lies your answer, no?

Each of the log entry records this was before, and this is after
the change.  ref@{0} reads from the after field of 0-th (from the
end) entry. ref@{1} reads from the after field of 1-st (again from
the end) entry.  ref@{N} reads from the after field of N-th (again
from the end) entry.

Notice that nowhere in the above sequence we read from before field.


--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: accessing oldest reflog entry with ref@{N}?

2013-06-19 Thread Jeff King
On Wed, Jun 19, 2013 at 11:48:01AM -0700, Junio C Hamano wrote:

 SZEDER Gábor sze...@ira.uka.de writes:
 
  $ git log --oneline -1 master@{1}
  fatal: Log for 'master' only has 1 entries.
 
  Annoyed, I just copy-pasted the sha and got the job done.
 
  However, I wonder why it didn't worked. 'git reflog' didn't print
  master@{1} or any message for the oldest entry, but I can live without
  that.
 
 There lies your answer, no?
 
 Each of the log entry records this was before, and this is after
 the change.  ref@{0} reads from the after field of 0-th (from the
 end) entry. ref@{1} reads from the after field of 1-st (again from
 the end) entry.  ref@{N} reads from the after field of N-th (again
 from the end) entry.
 
 Notice that nowhere in the above sequence we read from before field.

In general, the before from entry @{N} should be the same as the
after of @{N+1}. Of course this is not always the case for various
reasons, the most common of which I think are:

  1. Buggy scripts which do not provide a reflog reason for their call
 to git-update-ref, and therefore update the ref without writing a
 reflog entry.

  2. A git-gc will expire entries which point to unreachable objects
 much earlier, which can create holes in the reflog.

So it is certainly not correct to say we do not have a master@{1}
entry, but we know that the 'before' entry of master@{0} must point to
the same thing. But it is very often a good guess. I wonder if there
should be some simple way to expose that value as an @{}-selector.
Perhaps ref@{0.before} or something?

-Peff
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html