Да
$ git checkout asdfadsf
error: pathspec 'asdfasdf' did not match any file(s) known to git
Это не удалось, потому что у меня нет ветви asdfasdf
. Git попытался обработать asdfasdf
как имя файла, а у меня * * * * * нет файла с именем asdfasdf
.
$ git checkout -b asdfasdf
Switched to a new branch 'asdfasdf'
Это удалось и создал новую ветвь.
С другой стороны, у меня нет ветви с именем maint
, и все же:
$ git checkout maint
Branch 'maint' set up to track remote branch 'maint' from 'origin'.
Switched to a new branch 'maint'
Это тоже создало новую ветку, maint
. Но обратите внимание, как это выглядит по-другому. Это все еще говорит Switched to a new branch
, но сначала это говорит Branch 'maint' set up to track remote branch 'maint' from 'origin'.
Причина этого немного сложна, но сводится к следующему:
- Без
-b
, если вы попросите ветку, которой у вас нет, Git попробует несколько альтернатив. Некоторые из них могут работать! Когда он работает так же, как maint
здесь, в новой ветви уже установлен upstream .
- При
-b
Git просто создаст ветку, без вопросов (при условии, что создание новой ветки возможно). Новая ветка не будет настроена с восходящим потоком. Если у вас уже есть ветка, вы получите ошибку.
Если вы хотите ветку с установленным восходящим потоком - например, если есть origin/feature/x123
, и вы хотите, чтобы ваш собственный feature/x123
был создан, чтобы соответствовать - вы не хочу параметр -b
, потому что он не будет выполнять поиск восходящего потока origin/feature/x123
. Если вы не хотите установить восходящий поток, вы делаете хотите параметр -b
.
(Если вы хотите, чтобы восходящий набор был для вас - это отдельный вопрос. Найдите в StackOverflow существующие ответы.)