Проверка тега Git приводит к «отключенному состоянию HEAD» - PullRequest
157 голосов
/ 07 апреля 2011

Я разрабатываю сценарий развертывания для моего проекта git, и я только начал использовать теги. Я добавил новый тег с именем v2.0:

git tag -a v2.0 -m "Launching version 2.0"

И я поместил этот тег в удаленный репозиторий

git push --tags

Когда я пытаюсь выполнить сценарий развертывания и проверить тег v2.0, я получаю следующее сообщение:

Вы находитесь в состоянии «отсоединенная ГОЛОВА». Вы можете осмотреться, внести экспериментальные изменения и зафиксировать их, а также отменить любые коммиты Вы делаете в этом состоянии, не влияя на какие-либо ветви, выполняя еще одна проверка. Если вы хотите создать новую ветку для сохранения коммитов вы создаете, вы можете сделать это (сейчас или позже), используя -b с проверкой команда снова. Пример: git checkout -b new_branch_name HEAD сейчас при

Это нормально? Хранилище находится в подвешенном состоянии, потому что если я сделаю:

git branch

Я получаю этот вывод:

* (no branch)
  master

Извините, если это очевидно, но я не смог понять.

Ответы [ 2 ]

412 голосов
/ 07 апреля 2011

Хорошо, сначала несколько терминов слегка упрощены.

В git tag (как и во многих других вещах) - это то, что называется древовидным . Это способ ссылки на точку в истории проекта. Treeishes может быть тегом, коммитом, спецификатором даты, порядковым спецификатором или многими другими вещами.

Теперь branch похож на тег, но может быть перемещаемым. Когда вы «включаете» ветвь и делаете коммит, ветка перемещается на новый коммит, который вы сделали, что указывает на его текущую позицию.

Ваш HEAD является указателем на ветку, которая считается "текущей". Обычно, когда вы клонируете репозиторий, HEAD будет указывать на master, что, в свою очередь, будет указывать на коммит. Когда вы затем делаете что-то вроде git checkout experimental, вы переключаете HEAD, чтобы указать на ветку experimental, которая может указывать на другой коммит.

Теперь объяснение.

Когда вы делаете git checkout v2.0, вы переключаетесь на коммит, на который не указывает branch. HEAD теперь «отделен» и не указывает на ветку. Если вы решите сделать коммит сейчас (как вы можете), нет указателя ветки для обновления, чтобы отслеживать этот коммит. Переключение на другой коммит заставит вас потерять этот новый коммит, который вы сделали. Это то, что говорится в сообщении.

Обычно вы можете сказать git checkout -b v2.0-fixes v2.0. Это создаст новый указатель ветви при коммите, на который указывает древовидный v2.0 (тег в данном случае), а затем сместит ваш HEAD, чтобы указать на это. Теперь, если вы делаете коммиты, вы сможете отслеживать их (используя ветку v2.0-fixes), и вы можете работать как обычно. Нет ничего «неправильного» в том, что вы сделали, особенно если вы просто хотите взглянуть на код v2.0. Однако, если вы хотите внести какие-либо изменения, которые вы хотите отслеживать, вам понадобится ветвь.

Вы должны потратить некоторое время на понимание всей модели DAG в git. Это на удивление просто и проясняет все команды.

12 голосов
/ 07 апреля 2011

Да, это нормально.Это потому, что вы извлекаете один коммит, у которого нет головы.Особенно это (рано или поздно) не глава какой-либо ветви.

Но обычно с этим состоянием проблем нет.Вы можете создать новую ветку из тега, если это заставляет вас чувствовать себя в большей безопасности:)

...