Skip to content
  • Jeff King's avatar
    checkout: restrict @-expansions when finding branch · fd4692ff
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When we parse "git checkout $NAME", we try to interpret
    $NAME as a local branch-name. If it is, then we point HEAD
    to that branch. Otherwise, we detach the HEAD at whatever
    commit $NAME points to.
    
    We do the interpretation by calling strbuf_branchname(), and
    then blindly sticking "refs/heads/" on the front. This leads
    to nonsense results when expansions like "@{upstream}" or
    "@" point to something besides a local branch. We end up
    with a local branch name like "refs/heads/origin/master" or
    "refs/heads/HEAD".
    
    Normally this has no user-visible effect because those
    branches don't exist, and so we fallback to feeding the
    result to get_sha1(), which resolves them correctly.
    
    But as the new test in t3204 shows, there are corner cases
    where the effect is observable, and we check out the wrong
    local branch rather than detaching to the correct one.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    fd4692ff