Subject: Re: Why do dates in refspecs require the reflog?

From: Junio C Hamano <[email-masked]>
Date: Tue, 30 Dec 2014 12:31:00 -0800

Robert Dailey <[email-masked]> writes:

> I was surprised to find today that the following didn't work as expected:
>
> $ git show master@{"1 year ago"}:Path/To/File.h
>
> It gave me the following warning which did not make the problem obvious at all:
> warning: Log for 'master' only goes back to Mon, 8 Sep 2014 12:08:44 -0500.
>
> What it is trying to tell me (and I only found this out after a lot of
> poking and prodding around Google) is that I can't refer to a commit
> by date if it extends beyond the range of the reflog.
>
> I don't understand why this requirement is in place. Each commit has a
> time stamp, so in theory it should be possible to calculate an
> absolute date from the duration specified in the refspec and grab the
> commit from `git log` from that.

The reason is because the dates on the commit object itself do not
have anything to do with the question you are asking with the
"@{date}" notation.  master@{at-this-time} notation specifies the
commit that was at the tip of your master branch at the specified
time, and that information can _only_ come from your own reflogs.

If you did this in your copy of git.git repository today:

    $ git checkout -b test e83c5163316f89bfbd
    $ sleep 3600
    $ git reset --hard master
    $ git show test@{20.minutes.ago}

you will see e83c516, even though that commit is almost 10 years
old.  Now what was at the tip of your "test" branch on April 7th,
2005?  The answer is "nothing", as most likely your 'test' branch
did not exist back then.

And that is why "git show test@{2005/04/07}" will not (and should
not) look at the timestamps in commit objects.