Не вижу веток при клонировании репозитория - PullRequest
0 голосов
/ 27 мая 2018

Я клонирую проект gitlab на новом компьютере.

Если я набираю "git branch", я вижу только главную ветвь.

Если я набираю "git branch -a",я вижу другие ветви в красном с префиксом «remotes / origin».

Я могу увидеть, что находится в этих ветках, набрав:

git checkout remotes/origin/mybranch

Но я видел эту команду в некоторых уроках:

git fetch origin mybranch:mybranch

В этом случае mybranch появится в команде "git branch", но я не совсем понимаю, что делает эта команда.Ветви уже загружены и извлечены при первой операции клонирования?

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Это совершенно нормально.

Когда вы впервые клонируете какой-нибудь репозиторий, вы даете указание вашему Git вызвать другой Git по некоторому URL:

git clone <url>

Ваш Git начинается с созданияновый пустой репозиторий - в нем нет коммитов и веток.Затем он устанавливает remote - обычно имя origin, которое записывает URL-адрес, который вы дали - и запускает git fetch.Эта операция извлечения переносит все их коммиты, которых у вас нет, что, конечно, является просто «всеми коммитами», поскольку у вас их еще нет.

В конце процесса извлечения, ваш Git устанавливает все ваши имена для удаленного слежения , 1 origin/*.Вы получаете одно такое имя для каждого имени ветки в другом Git.Обратите внимание, что на данный момент у вас все еще нет собственных имен веток!

Мы можем нарисовать имена коммитов и удаленного отслеживания обычным способом:

...--o--o--o   <-- origin/master
      \
       o--o   <-- origin/develop

и так далее.Каждое отдельное имя указывает на один конкретный коммит, наконечник ветви.

Что нужно сделать, чтобы добавить свои коммиты к одному из нихэто создать ваше собственное имя ветки, указывая на один из этих коммитов.На самом деле, вы должны сделать это, чтобы иметь возможность git checkout <em>somebranch</em>.Итак, последнее, что git clone делает, это запускается:

git checkout master

(или, может быть, какое-то другое имя, в зависимости от того, что вы скажете ему проверить в конце).Это вызывает немного магии.

Git просматривает все ваши собственные имена ветвей, которых нет.Не находит master.Вместо того, чтобы жаловаться на и ничего не делать, ваш Git продолжает просматривать все ваши имена для удаленного слежения .Он ищет тот, который похож на master, и находит точно один: origin/master.Таким образом, ваш Git на данный момент создает имя master и устанавливает его так, чтобы он указывал на тот же коммит как origin/master:

...--o--o--o   <-- master (HEAD), origin/master
      \
       o--o   <-- origin/develop

Теперь, когда имя master существует, git checkout может проверить его, и теперь вы находитесь на ветке master.

Ни одно из других origin/* имен не использовалось ... еще .Но если вы сейчас выполните:

git checkout develop

, ваш Git проходит тот же процесс: develop не существует, поэтому он просматривает все ваши имена для удаленного отслеживания и находит origin/develop.Затем он говорит себе: Ага, вы должны захотеть, чтобы я создал develop, указывающий на тот же коммит, что и origin/develop, а затем переключиться на develop! Итак, он делает это:

...--o--o--o   <-- master, origin/master
      \
       o--o   <-- develop (HEAD), origin/develop

На этих рисунках я прикрепляю слово HEAD к текущей проверенной ветви.Git делает то же самое внутри: вот как Git знает, в какой ветке вы находитесь, и какое имя ветви нужно изменить при добавлении новых коммитов.

Обратите внимание, что нет необходимости создавать новыйимя ветки, пока вы не захотите добавить коммиты к нему .Вы можете проверить конкретную фиксацию по ее хэш-идентификатору или использовать git checkout origin/develop вместо git checkout develop.Это дает вам то, что Git называет detached HEAD:

...--o--o--o   <-- master, origin/master
      \
       o--o   <-- HEAD, origin/develop

Теперь HEAD указывает непосредственно на коммит, вместо того, чтобы отмечать имя ветви и позволять имени ветви указывать накоммит.Это нормально, пока вы не сделаете new commits;то вы, вероятно, хотите, чтобы иметь имя ветви, чтобы вспомнить последний такие совершить


1 Это спорно, является ли это также считаются «имена филиалов.».Это, безусловно, имена , и они определяют кончики структурных ветвей в графе коммитов.Но двухсловная фраза удаленные ветви , которую некоторые люди используют для обозначения этих слов, вводит в заблуждение.Это имена в вашем хранилище Git!Git называет их названиями веток удаленного отслеживания , которые используют объединенную строку слов remote + tracking + ветка таким образом, что отличается от других способов, которыми Git использует каждое отдельное слово.Неудивительно, что люди находят Гита сводящим с ума.

0 голосов
/ 27 мая 2018

https://git -scm.com / docs / git-fetch :

<refspec>

Указывает, какие ссылки выбирать и какие локальные ссылкиобновлять.Когда <refspec> s не появляется в командной строке, ссылки на выборку считываются из remote.<repository>.fetch переменных (см. Ниже КОНФИГУРИРОВАННЫЕ УДАЛЕННО-ОТСЛЕЖИВАЮЩИЕ ФИЛИАЛЫ).

Формат параметра <refspec> являетсянеобязательный плюс +, за которым следует источник <src>, за которым следует двоеточие:, за которым следует пункт назначения <dst>.Двоеточие можно опустить, если <dst> пусто.<src> обычно является ссылкой, но это также может быть полностью записанное имя шестнадцатеричного объекта.

tag <tag> означает то же самое, что и refs/tags/<tag>:refs/tags/<tag>;он запрашивает выборку всего до заданного тега.

Удаленная ссылка, соответствующая <src>, выбирается, и если <dst> не является пустой строкой, локальная ссылка, которая соответствует ей, быстро пересылается с использованием <src>.Если используется дополнительный плюс +, локальная ссылка обновляется, даже если это не приводит к обновлению в ускоренном режиме.

Итак, эта команда: извлекает mybranch из удаленного origin;Быстрая перемотка локального mybranch к выбранному.Так что

mybranch появится в команде "git branch"

, потому что теперь есть локальный mybranch.

Филиалы уже были загружены и извлечены при первой операции клонирования

Но локальные ветви (кроме стандартных по умолчанию, обычно master) не создаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...