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

Re: [RFC] git reflog show

From
Junio C Hamano <junkio@cox.net>
Date
Dec 25, 2006, 18:07 UTC
Message-ID
<7vwt4fj1cs.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.63.0612251449140.19693@wbgn013.biozentrum.uni-wuerzburg.de>
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
Show 8 quoted lines
>> Also I highly doubt visualization based on parents information rewritten 
>> to match the reflog order is of _any_ use.  By rewriting the parenthood, 
>> you are losing the topology and your visualization is no better than 
>> what "tac .git/logs/$ref" would give.
>
> Okay, but if they are _not_ rewritten, we can reuse the log machinery to 
> show the revisions in "upstream..master@{2.hours.ago}", but in the order 
> they came into the local repository.

Shawn's code was about showing where the tip of the branch was, and I think you are talking about something entirely different, which I would address later.

A sensible way to reuse existing code to implement Shawn's one is to add the revisions to rev.pending, and iterate over that array like "git show" does. This does not need to touch the existing revision walking code at all. The most valuable parts of the revision walking code are about ancestry traversal and history simplification with pathspec, neither of which makes much sense to use when "walking" reflog. Reflog walking might want to use the filtering by commit_match() but then it is only the matter of renaming the function to a bit more specific name and exporting it.

You can largely reuse the display side of the code that way, and I think you should be able to hook into the code without making it too specific to the reflog (perhaps using object->util and/or a callback) if you need to give extra information (e.g. comments and commit information from the log).

But it _also_ makes sense to use reflog when the primary thing we are interested in seeing is not how the tip jumped around, but seeing how the branch acquired commits, which I think is what you are suggesting. What we would want to have is a sort order different from the existing topo or date, which is "reflog order". While I think it makes sense, a naive implementation would be somewhat expensive. Instead of sorting topologically at the end of prepare_revision_walk (you would need to limit the list if you do this), for each commit, you binary search the reflog entries to find the earliest one that is the ancestor of the commit, and use the reflog entry's timestamp as the age of the commit (it's the first time the branch saw that commit), and sort commits using that.

Previous: Johannes SchindelinNext: Shawn Pearce
Message 8 of 14 in “[RFC] git reflog show”
  1. Shawn PearceDec 23, 2006
  2. Junio C HamanoDec 23, 2006
  3. Johannes SchindelinDec 23, 2006
  4. Shawn PearceDec 24, 2006
  5. Johannes SchindelinDec 24, 2006
  6. Junio C HamanoDec 24, 2006
  7. Johannes SchindelinDec 25, 2006
  8. Junio C HamanoDec 25, 2006
  9. Shawn PearceDec 26, 2006
  10. Junio C HamanoDec 26, 2006
  11. Johannes SchindelinDec 26, 2006
  12. Junio C HamanoDec 26, 2006
  13. Johannes SchindelinDec 26, 2006
  14. Junio C HamanoDec 26, 2006

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.