Проверка тега Git приводит к "отключенному состоянию HEAD"

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

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

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

git push --tags

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

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

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

git branch

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

* (no branch)
  master

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

Ответ 1

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

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

Теперь branch похож на тег, но является подвижным. Когда вы являетесь "on" веткой и совершаете фиксацию, ветвь перемещается в новый фиксатор, который вы сделали, указывая на текущую позицию.

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

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

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

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

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

Ответ 2

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

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