| I'm going to discuss mental models in a separate comment because they're actually more interesting and this comment is getting too long. ---Succinct argument--- What happens if you remove the flag? Put differently, how much does the flag change the semantics? `git branch newbranch` will gracefully fall back to creating a new branch at HEAD. `git checkout newbranch` will fail (error: pathspec 'newbranch' did not match any file(s) known to git), because the regular version of the command involves operating on something that already exists. ---Less succinct further argument--- checkout's `-B` variant. Here's how the man page explains it: > If -B is given, <new_branch> is created if it doesn’t exist; otherwise, it is reset. This is the transactional equivalent of
>
> $ git branch -f <branch> [<start point>]
> $ git checkout <branch> If it were a flag on branch, you wouldn't need a separate flag, just `git branch -fs newbranch` (-s for --switch). Actually, looking through the man page for `checkout` now, I see 4 other options I didn't know about (-t|--track, --no-track, --guess, --no-guess), apparently for the sole purpose of being used with -b. --- I don't think I thought of this argument when I originally chatted in #git-devel, maybe I'll give it another try. |