git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: How to display "HEAD~*" in "git log"

From
Jeff King <peff@peff.net>
Date
Jul 7, 2022, 17:06 UTC
Message-ID
<YscSigm9b8QJMuRM@coredump.intra.peff.net>
In-Reply-To
<20220706182149.gg75w6uonm4hs5af@carbon>
On Wed, Jul 06, 2022 at 09:21:49PM +0300, Konstantin Khomoutov wrote:
Show 6 quoted lines
> > Right. The problem is that it gets the set of possible ref tips with
> > for_each_ref(), which will not include HEAD. And then worse, since the
> > argument to "--refs" is a pattern, it matches junk like origin/HEAD.
> 
> Do I assume correctly that `git for-each-ref HEAD` does nothing, successfully,
> for the very same reason?
Yes.
Show 14 quoted lines
> If so, I wonder if this should be somehow reflected in the docs.
> I mean, I have always maintained an impression that things like HEAD,
> ORIGIN_HEAD, FETCH_HEAD etc are also "refs" - because they, well, reference
> commits or branches.
> 
> The gitglossary manual page of my Git 2.30.2 states that
> 
> | ref
> |   A name that begins with refs/ (e.g. refs/heads/master)
> | <...>
> |   There are a few special-purpose refs that do not begin with refs/.
> |   The most notable example is HEAD.
> 
> which suggests that HEAD is a ref.

Yeah, I think the situation around those top-level names is...complicated. They act like refs when you name them, but they are often omitted from iteration of refs. And yet many spots (e.g., "rev-list --all") will include them explicitly. Documentation aside, I would not be surprised if there are still places in the code itself where there are inconsistencies. I feel like we've had a number of "oops, include HEAD in this corner case" patches pop up over the years. Maybe we've gotten them all now?

All of which is to say: you're definitely not wrong, but I'm not sure what simple documentation change would be helpful. The handling of HEAD in each specific situation could be mentioned in their respective documentation spots, but identifying all of those is tough. Possibly the glossary entry should say something like:

  Note that HEAD is sometimes includes in sets of refs (e.g., in `git
  rev-list --all`) and sometimes not (e.g., in `git for-each-ref`).
but that may be too vague to be helpful to anybody.
-Peff
Previous: Konstantin KhomoutovNext: Junio C Hamano
Message 10 of 11 in “How to display "HEAD~*" in "git log"”
  1. wuzhouhuiJul 5, 2022
  2. Konstantin KhomoutovJul 5, 2022
  3. Konstantin KhomoutovJul 5, 2022
  4. wuzhouhuiJul 5, 2022
  5. kostix@bswap.ruJul 6, 2022
  6. Jeff KingJul 6, 2022
  7. Konstantin KhomoutovJul 6, 2022
  8. Jeff KingJul 6, 2022
  9. Konstantin KhomoutovJul 6, 2022
  10. Jeff KingJul 7, 2022
  11. Junio C HamanoJul 6, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.