Чтобы добавить к ответу Шлейса , когда вы запускаете git clone
с -b <branchname>
, вы говорите своему Git, что делать на последнем шаге. Помните, что git clone <em>url</em> <em>dest</em>
фактически является сокращением для этой последовательности шагов из шести шагов:
mkdir <em>dest</em>
, чтобы создать новый пустой каталог. Если вы пропустите аргумент dest
, Git построит его на основе предоставленного вами url
. (Если вы называете существующий каталог, он должен быть пустым.) Остальные операции будут выполняться в этом каталоге, как будто через cd <em>dest</em>
, хотя это не влияет на вашу оболочку.
git init
: это создает новый пустой репозиторий - каталог .git
- в противном случае пустой каталог.
git remote add origin <em>url</em>
: это добавляет удаленный сервер с именем origin
,к конфигурации этого нового пустого хранилища. (Вы можете выбрать имя, отличное от origin
, если хотите, с помощью опции -o
до git clone
.) Если вы использовали --single-branch
, то в этот момент фактически проходит одна ветвь. (Я говорю «эффективно» только потому, что эта часть процесса встроена в саму команду git clone
.)
Установите любые дополнительные git config
команды, которые вы указали в *Команда 1040 * (с добавлением опций -c
после слова clone
: -c
опции до слово clone
может применяться к процессу клонирования, но не устанавливается в клон).
Запустите git fetch origin
(или любое другое имя, которое вы выбрали). Это получает все коммиты, опубликованные по URL. Он также получает список имен веток и тегов (и других ссылок) из другого Git;эти имена веток становятся вашими именами remote-tracking , и на этом этапе эти имена тегов обычно также копируются в ваш репозиторий. 1
Наконец, ваш Git выбирает какое-то имя ветки, чтобы, по сути, перейти к git checkout
. Какую ветку Git собирается назвать git checkout
? Ответ зависит от того, предоставили ли вы флаг -b
.
Если вы предоставите -b foo
, ваш Git попытается git checkout foo
. Это зависит от существования origin/foo
, созданного на шаге 5 из их Git's foo
. Если вы предоставите -b master
, ваш Git попытается git checkout master
. Но если вы не предоставите любой -b
, ваш Git спросит их Git, какую ветку они рекомендуют.
В этом случае происходит то, что их Git рекомендует master
, или ничего не рекомендует. Мы не можем сказать, какой из этих случаев вы опубликовали, но это не имеет значения, потому что у них нет master
. Если они рекомендуют вашему Git использовать свои master
для создания master
, это не получится: у них нет master
. Если они вообще не дают никаких рекомендаций, ваш Git в качестве последней вещи будет считать, что он должен использовать master
, и будет искать ваш origin/master
как скопированный из их master
, но у вас его не будет.
Итак, что бы ни происходило в этот момент, у вашего Git нет ветки для проверки. У вас до есть origin/development
, как скопировано с их development
. Таким образом, вы можете запустить git checkout development
, который смотрит вокруг, видит, что у вас нет development
, оглядывается еще раз, видит, что у вас do есть origin/development
, и делает то, что вы хотели.
Как сделать разработку своей веткой по умолчанию при клонировании?
Вы можете попробовать их Git, чтобы порекомендовать это имя.
Чтобы сделать это традиционным способом (не GitHub-ish), войдите на сервер, перейдите к репозиторию --bare
(где бы он ни находился) и выполните:
git symbolic-ref HEAD refs/heads/development
и теперь их Git рекомендует development
.
Чтобы сделать это с GitHub, см. инструкции GitHub . Для этого воспользуйтесь их инструкциями , где бы они ни находились.
1 Имя ветви или тега может существовать, только если существует идентификатор объекта, записанный в этом имени ветви или тега. Следовательно, если вы ограничили набор копируемых коммитов, возможно, вашему Git придется пропустить некоторые имена. Например, если один из их тегов, например v0.1
, указывает на фиксацию, которую вы намеренно пропустили с помощью --single-branch
и / или --shallow
, у вас не будет этого тега. Если их ветвь debug
указывает на какой-то коммит, который вы не взяли, потому что вы сказали --single-branch foo
, у вас не может быть origin/debug
. Обратите внимание, что --shallow
подразумевает --single-branch
.