Что такое «текущая активная ветка клонированного репозитория» - PullRequest
1 голос
/ 13 сентября 2010

Я достаточно успешно использую Git (возможно, это оптимистичная оценка) уже 2 года, но, по общему признанию, делал это несколько слепо.По какой-то причине я начал интересоваться внутренними объектами и в последнее время копаюсь в ветвях удаленного отслеживания.В целом они имеют смысл, но у меня остался такой вопрос:

Когда я клонирую репозиторий и создаются все удаленные ветви отслеживания, что такое «текущая активная ветка клонированного репозитория»?(цитата из документации git-clone)?

Если бы я клонировал из репозитория коллеги, я полагаю, это будет ветвь отслеживания того локального филиала, в котором *перед этим в git branch результатах, но что, если я клонировал из Github?Это просто ветка, которую я выбрал в интерфейсе?Первоначальные тесты показывают, что это не так.

Спасибо.

1 Ответ

1 голос
/ 13 сентября 2010

Активная ветвь репозитория Git - это ветвь, на которую указывает его HEAD.

Внутренне HEAD - это просто файл, который находится в верхней части GIT_DIR хранилища (каталог .git неголый репозиторий или вершина голого репозитория).Если HEAD выглядит как ref: refs/some/thing, то оно интерпретируется как symref (символьная ссылка) для именованного ref (обычно ветвь под refs/heads/).Если HEAD содержит 40-байтовое шестнадцатеричное представление ASCII имени объекта (SHA-1), то мы говорим, что это «отсоединенный HEAD» (так как он не «присоединен» к нормальной ветви), и он работает как обычный ref (то есть работает как любая другая ветвь).

Как вы и предполагали, git branch покажет текущую активную ветвь со звездочкой перед ней.Это работает в обычных (не голых) и пустых репозиториях.

В обычных (не голых) репозиториях (с работающими деревьями) HEAD автоматически поддерживается при обычном использовании git checkout :

git checkout other-branch
# HEAD is now a symref to refs/heads/other-branch

Голые репозитории (обычно используемые на серверах) не имеют рабочего дерева, поэтому git checkout не будет работать.Чтобы обновить голый репозиторий HEAD, вы должны использовать git symbolic-ref :

git symbolic-ref -m 'new default branch' HEAD refs/heads/other-branch
# HEAD is now a symref to refs/heads/other-branch

В обоих случаях вы должны иметь прямой доступ к репозиториюобновить HEAD, чтобы изменить текущую активную ветку.Как и большинство хостинг-провайдеров, GitHub не предоставляет прямой доступ к репозиториям.Однако он предоставляет веб-интерфейс , который позволяет пользователям изменять HEAD своих репозиториев (они называют его «веткой по умолчанию»).

...