On 05/07/17 09:00, Jeff King wrote: > Since its inception, the general strategy of the reflog-walk > code has been to start with the tip commit for the ref, and > as we traverse replace each commit's parent pointers with > fake parents pointing to the previous reflog entry. > > This lets us traverse the reflog as if it were a real > history, but it has some user-visible oddities. Namely: > > 1. The fake parents are used for commit selection and > display. So for example, "--merges" or "--no-merges" > are useful, because the history appears as a linear > string. Likewise, pathspec limiting is based on the > diff between adjacent entries, not the changes actually > introduced by a commit. > > These are often the same (e.g., because the entry was > just running "git commit" and the adjacent entry _is_ > the true parent), but it may not be in several common > cases. For instance, using "git reset" to jump around > history, or "git checkout" to move HEAD. > > 2. We reverse-map each commit back to its reflog. So when > it comes time to show commit X, we say "a-ha, we added > X because it was at the tip of the 'foo' reflog, so > let's show the foo reflog". But this leads to nonsense > results when you ask to traverse multiple reflogs: if > two reflogs have the same tip commit, we only map back > to one of them. > > Instead, we should show each reflog individually, in > the order the user gave us on the command line. > > 2. If the tip of the reflog and the ref tip disagree on ^^ It seems hard to get off the second point! ;-) ATB, Ramsay Jones