Skip to content
  • Ævar Arnfjörð Bjarmason's avatar
    checkout: add advice for ambiguous "checkout <branch>" · ad8d5104
    Ævar Arnfjörð Bjarmason authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    As the "checkout" documentation describes:
    
        If <branch> is not found but there does exist a tracking branch in
        exactly one remote (call it <remote>) with a matching name, treat
        as equivalent to [...] <remote>/<branch.
    
    This is a really useful feature. The problem is that when you add
    another remote (e.g. a fork), git won't find a unique branch name
    anymore, and will instead print this unhelpful message:
    
        $ git checkout master
        error: pathspec 'master' did not match any file(s) known to git
    
    Now it will, on my git.git checkout, print:
    
        $ ./git --exec-path=$PWD checkout master
        error: pathspec 'master' did not match any file(s) known to git.
        hint: 'master' matched more than one remote tracking branch.
        hint: We found 26 remotes with a reference that matched. So we fell back
        hint: on trying to resolve the argument as a path, but failed there too!
        hint:
        hint: If you meant to check out a remote tracking branch on, e.g. 'origin',
        hint: you can do so by fully qualifying the name with the --track option:
        hint:
        hint:     git checkout --track origin/<name>
    
    Note that the "error: pathspec[...]" message is still printed. This is
    because whatever else checkout may have tried earlier, its final
    fallback is to try to resolve the argument as a path. E.g. in this
    case:
    
        $ ./git --exec-path=$PWD checkout master pu
        error: pathspec 'master' did not match any file(s) known to git.
        error: pathspec 'pu' did not match any file(s) known to git.
    
    There we don't print the "hint:" implicitly due to earlier logic
    around the DWIM fallback. That fallback is only used if it looks like
    we have one argument that might be a branch.
    
    I can't think of an intrinsic reason for why we couldn't in some
    future change skip printing the "error: pathspec[...]" error. However,
    to do so we'd need to pass something down to checkout_paths() to make
    it suppress printing an error on its own, and for us to be confident
    that we're not silencing cases where those errors are meaningful.
    
    I don't think that's worth it since determining whether that's the
    case could easily change due to future changes in the checkout logic.
    
    Signed-off-by: default avatarÆvar Arnfjörð Bjarmason <avarab@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    ad8d5104