On Fri, Jan 01, 2021 at 05:36:06PM -0800, Denton Liu wrote: > This sequence works > > $ git checkout -b newbranch > $ git commit --allow-empty -m one > $ git show -s newbranch@{1} > > and shows the state that was immediately after the newbranch was > created. > > But then if you do > > $ git reflog expire --expire=now refs/heads/newbranch > $ git commit --allow=empty -m two > $ git show -s newbranch@{1} > > you'd be scolded with > > fatal: log for 'newbranch' only has 1 entries > > While it is true that it has only 1 entry, we have enough > information in that single entry that records the transition between > the state in which the tip of the branch was pointing at commit > 'one' to the new commit 'two' built on it, so we should be able to > answer "what object newbranch was pointing at?". But we refuse to > do so. Great! I've run into this issue quite a while ago with regular 'git gc' expiring too old reflog entries, and wondered while the @{N} notation errored out while the information was clearly still there in the reflog. https://public-inbox.org/git/20130619125059.GD20052@goldbirke/T/#u > @@ -139,6 +139,19 @@ test_expect_success 'master@{n} for various n' ' > test_must_fail git rev-parse --verify master@{$Np1} > ' > > +test_expect_success '@{1} works with only one reflog entry' ' > + git checkout -B newbranch && > + git reflog expire --expire=now refs/heads/newbranch && > + git commit --allow-empty -mexpired && > + git rev-parse --verify newbranch@{1} > +' > + > +test_expect_success '@{0} works with empty reflog' ' > + git checkout -B newbranch && > + git reflog expire --expire=now refs/heads/newbranch && > + git rev-parse --verify newbranch@{0} > +' I agree with Martin about these tests: not failing is one thing, but we should make sure that the right value is printed. > test_expect_success SYMLINKS 'ref resolution not confused by broken symlinks' ' > ln -s does-not-exist .git/refs/heads/broken && > test_must_fail git rev-parse --verify broken > -- > 2.30.0 >