Я разрабатываю сценарий развертывания для моего проекта git, и я только начал использовать теги. Я добавил новый тег под названием v2.0
:
git tag -a v2.0 -m "Launching version 2.0"
И я поместил этот тег в удаленный репозиторий
git push --tags
Когда я пытаюсь выполнить сценарий развертывания и проверить v2.0
тег, я получаю следующее сообщение:
Вы находитесь в состоянии «отсоединенная ГОЛОВА». Вы можете осмотреться, внести экспериментальные изменения и зафиксировать их, а также можете отменить любые коммиты, которые вы делаете в этом состоянии, не влияя на какие-либо ветви, выполнив другую проверку. Если вы хотите создать новую ветку для сохранения созданных вами коммитов, вы можете сделать это (сейчас или позже), снова используя -b с командой checkout. Пример: git checkout -b new_branch_name HEAD теперь находится на
Это нормально? Хранилище находится в подвешенном состоянии, потому что если я сделаю:
git branch
Я получаю этот вывод:
* (no branch)
master
Извините, если это очевидно, но я не мог понять это.
источник
Ответы:
Хорошо, сначала несколько терминов, несколько упрощенных.
В
git
,tag
(как и многие другие вещи) это то, что называется древовидная . Это способ ссылки на точку в истории проекта. Treeishes может быть тегом, коммитом, спецификатором даты, порядковым спецификатором или многими другими вещами.Теперь
branch
тег похож на тег, но является подвижным. Когда вы «включаете» ветвь и делаете коммит, ветка перемещается на новый коммит, который вы сделали, что указывает на его текущую позицию.Ваш
HEAD
указатель на ветку, которая считается "текущей". Обычно, когда вы клонируете репозиторий, онHEAD
будет указывать на то,master
что в свою очередь будет указывать на коммит. Когда вы затем делаете что-то подобноеgit checkout experimental
, вы переключаетесь,HEAD
чтобы указать наexperimental
ветку, которая может указывать на другой коммит.Теперь объяснение.
Когда вы делаете a
git checkout v2.0
, вы переключаетесь на коммит, на который не указывает abranch
.HEAD
Теперь «отдельные» и не указывает на ветви. Если вы решите сделать коммит сейчас (как вы можете), нет указателя ветки для обновления, чтобы отслеживать этот коммит. Переключение на другой коммит заставит вас потерять этот новый коммит, который вы сделали. Вот что говорится в сообщении.Обычно вы можете сказать
git checkout -b v2.0-fixes v2.0
. Это создаст новый указатель ветви на коммит, на который указывает treeishv2.0
(в данном случае тег), а затем сместит вашHEAD
указатель на это. Теперь, если вы делаете коммиты, можно будет отслеживать их (используяv2.0-fixes
ветку), и вы можете работать как обычно. Нет ничего «плохого» в том, что вы сделали, особенно если вы просто хотите взглянуть наv2.0
код. Однако, если вы хотите внести какие-либо изменения, которые вы хотите отследить, вам понадобится ветка.Вы должны потратить некоторое время на понимание всей модели DAG в git. Это удивительно просто и делает все команды достаточно понятными.
источник
git reflog
, о котором очень полезно знать! Если сборка мусора не произошла, казалось бы, «невозможно» потерять коммит.Да, это нормально. Это потому, что вы извлекаете один коммит, у которого нет головы. Тем более это (рано или поздно) не глава какой-либо отрасли.
Но обычно с этим состоянием проблем нет. Вы можете создать новую ветку из тега, если это заставляет вас чувствовать себя в большей безопасности :)
источник