On Fri, 30 Jun 2006, Linus Torvalds wrote: > > BTW! Junio, I think this patch actually fixes a real bug. > > Without this patch, the "--parents --full-history" combination (which > you'd get if you do something like > > gitk --full-history Makefile > > or similar) will actually _drop_ merges where all children are identical. > That's wrong in the --full-history case, because it measn that the graph > ends up missing lots of entries. Here's some real numbers. Before this patch git-rev-list --full-history HEAD -- Makefile | wc -l git-rev-list --parents --full-history HEAD -- Makefile | wc -l both returned 971 commits on my current kernel tree, while git-rev-list --parents HEAD -- Makefile | wc -l returned 145 commits, and git-rev-list --parents --no-merges HEAD -- Makefile | wc -l returns 136. That count of 145 is the number of commits that actually _change_ Makefile some way - and some of them really are merges, because they have a content merge, and the merge result is thus different from any of the children. So that's a real number. So is 136, in some sense - it just says that we don't care about commits, even if those commits _do_ end up changing the file. But the important part to realize is that the "971" number is always wrong. It's never a really valid number. It contains a lot of extra merges, but it does _not_ contain enough of them to connect all the dots, and it's thus never correct. Either you should drop merges that don't change things (in which case you cannot have full connectivity, and "--parents" doesn't make sense), or you should keep them all (or at least enough to get full connectivity). Now, AFTER this patch git-rev-list --full-history HEAD -- Makefile | wc -l returns 145 commits (the same 145 commits that really change Makefile, but we've now properly decided that because we don't have "--parents" and don't need to keep connectivity we drop _all_ of the merges that have a child that is identical), while git-rev-list --parents --full-history HEAD -- Makefile | wc -l returns 2323 commits, and now really has _all_ the merges (because it needs to include every single merge in the tree - otherwise the connectivity doesn't make sense). Now, that 2323 is a bit unnecessary - we end up having merges to merges that don't actually have any changes at all in between, and it might be nice to simplify the merge history to create a minimal tree that still has all potential changes in it, but that's a much harder problem. Anyway, the patch definitely makes a difference, and I think it's correct. The effects might be a bit easier to visualize on a smaller tree than the kernel ;) We could still potentially improve on the "--parents --full-history" case, but --full-history currently means always walking all possible chains, and that will be shown in the output (ie we will have all possible paths in the result if "--parents" is used, even if those paths end up being totally uninteresting) "Hey - you asked for full history, you got it. Don't blame me if you got a lot of totally uninteresting crud" Linus - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html