Now interpret_nth_prior_checkout() can tell the caller if the result of expansion of @{-1} is a real branch name or the commit object name for a detached HEAD state, let's avoid re-interpreting $HEX@{u} in the latter case. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- * This prevents us from mistakenly refering to the upstream of an unrelated branch in this sequence: HEX=$(git rev-parse --verify HEAD) git branch $HEX git checkout HEAD^0 git checkout - git log @{-1}@{u} The branch created in the first step has never been checked out, and @{-1} does not refer to it. @{-1}@{u} would first turn into $HEX@{u} but we should not look for upstream of refs/heads/$HEX. sha1_name.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/sha1_name.c b/sha1_name.c index 1473bb6..d3b6897 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -1004,15 +1004,21 @@ int interpret_branch_name(const char *name, struct strbuf *buf) char *cp; struct branch *upstream; int namelen = strlen(name); - int len = interpret_nth_prior_checkout(name, buf, NULL); + int detached; + int len = interpret_nth_prior_checkout(name, buf, &detached); int tmp_len; if (!len) return len; /* syntax Ok, not enough switches */ if (0 < len && len == namelen) return len; /* consumed all */ - else if (0 < len) { - /* we have extra data, which might need further processing */ + else if (0 < len && !detached) { + /* + * We have extra data, which might need further + * processing. E.g. for the original "@{-1}@{u}" we + * have converted @{-1} into buf and yet to process + * the remaining @{u} part. + */ struct strbuf tmp = STRBUF_INIT; int used = buf->len; int ret; -- 1.8.3-rc1-182-gc61d106 -- 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