On Thu, Apr 21, 2016 at 09:59:13AM -0700, Junio C Hamano wrote: > Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> writes: > > > That commit aed06b9 can also be described as > > > > v3.13-rc7~9^2~14^2~42 > > > > so describing it as 'v4.6-rc1~9^2~792' is clearly not closer in any way. > > I seem to recall that name-rev had an unexplained heuristics to > strongly avoid following second parent changes (I see two ^2 in the > path from 3.13-rc7 above). Right, because it makes the names longer. We give the second-parent traversal a heuristic cost. If we drop that cost to "1", like: diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 092e03c..03be8be 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -17,7 +17,7 @@ typedef struct rev_name { static long cutoff = LONG_MAX; /* How many generations are maximally preferred over _one_ merge traversal? */ -#define MERGE_TRAVERSAL_WEIGHT 65535 +#define MERGE_TRAVERSAL_WEIGHT 1 static void name_rev(struct commit *commit, const char *tip_name, int generation, int distance, then this case gives: v3.13~5^2~4^2~2^2~1^2~42 which is technically true, but kind of painful to read. It may be that a reasonable weight is somewhere between "1" and "65535", though. However, I think the more fundamental confusion with git-describe is that people expect the shortest distance to be the "first" tag that contained the commit, and that is clearly not true in a branchy history. I actually think most people would be happy with an algorithm more like: 1. Find the "oldest" tag (either by timestamp, or by version-sorting the tags) that contains the commit in question. 2. Find the "simplest" path from that tag to the commit, where we are striving mostly for shortness of explanation, not of path (so "~500" is way better than "~20^2~30^2~14", even though the latter is technically a shorter path). -Peff -- To unsubscribe from this list: 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