Skip to content
  • Duy Nguyen's avatar
    checkout: disambiguate dwim tracking branches and local files · be4908f1
    Duy Nguyen authored and Junio C Hamano's avatar Junio C Hamano committed
    When checkout dwim is added in [1], it is restricted to only dwim when
    certain conditions are met and fall back to default checkout behavior
    otherwise. It turns out falling back could be confusing. One of the
    conditions to turn
    
        git checkout frotz
    
    to
    
        git checkout -b frotz origin/frotz
    
    is that frotz must not exist as a file. But when the user comes to
    expect "git checkout frotz" to create the branch "frotz" and there
    happens to be a file named "frotz", git's silently reverting "frotz"
    file content is not helping. This is reported in Git mailing list [2]
    and even used as an example of "Git is bad" elsewhere [3].
    
    We normally try to do the right thing, but when there are multiple
    "right things" to do, it's best to leave it to the user to decide.
    Check this case, ask the user to to disambiguate:
    
    - "git checkout -- foo" will check out path "foo"
    - "git checkout foo --" will dwim and create branch "foo" [4]
    
    For users who do not want dwim, use --no-guess. It's useless in this
    particular case because "git checkout --no-guess foo --" will just
    fail. But it could be used by scripts.
    
    [1] 70c9ac2f (DWIM "git checkout frotz" to "git checkout -b frotz
        origin/frotz" - 2009-10-18)
    [2] https://public-inbox.org/git/CACsJy8B2TVr1g+k+eSQ=pBEO3WN4_LtgLo9gpur8X7Z9GOFL_A@mail.gmail.com/
    [3] https://news.ycombinator.com/item?id=18230655
    [4] a047fafc
    
     (checkout: allow dwim for branch creation for "git
        checkout $branch --" - 2013-10-18)
    
    Signed-off-by: default avatarNguyễn Thái Ngọc Duy <pclouds@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    be4908f1