Почему мой репозиторий Git вступил в состояние автономного состояния HEAD?

Сегодня у меня закончилась отдельная глава, та же проблема, что описана в: git push говорит все актуальное, хотя у меня есть локальные изменения

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

Итак, как я закончил с detached HEAD?

Ответ 1

Любая проверка коммита, который не является именем одной из ваших веток, даст вам отдельную ГОЛОВУ. SHA1, который представляет вершину ветки, все еще дает отделенную ГОЛОВУ. Только проверка локального имени ветки избегает этого режима.

См. фиксация с отсоединенной ГОЛОВКОЙ

. Когда HEAD отсоединен, коммиты работают как обычно, за исключением того, что ни одна из названных веток не обновляется. (Вы можете думать об этом как об анонимной ветке.)

alt text

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

См. git: ветвь переключателя без отсоединения головки


В Git 2.23 (август 2019 г.) вам больше не нужно использовать запутанную команду git checkout.

git switch также может извлекать ветку и получать отделение HEAD, кроме:

  • у него есть явная опция --detach

Чтобы проверить фиксацию HEAD~3 для временной проверки или эксперимента без создания новой ветки:

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
  • он не может по ошибке отсоединить удаленную ветвь отслеживания

См:

C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

Vs. используя новую команду git switch:

C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

Если вы хотите создать новую локальную ветку, отслеживающую удаленную ветку:

git switch <branch> 

Если <branch> не найден, но существует ветвь отслеживания ровно в одном удаленном устройстве (назовите его <remote>) с соответствующим именем, обрабатывайте его как эквивалент

git switch -c <branch> --track <remote>/<branch>

Нет больше ошибки!
Нет больше нежелательной головы!

Ответ 2

Я воспроизвел это сейчас случайно:

  • перечислены удаленные ветки

    git branch -r
          origin/Feature/f1234
          origin/master
    
  • Я хочу проверить один локально, поэтому я вырезал пасту:

    git checkout origin/Feature/f1234
    
  • Presto! Отдельное состояние HEAD

    You are in 'detached HEAD' state. [...])
    

Решение №1:

Не включайте origin/ в начале спецификации моего ветки при проверке:

git checkout Feature/f1234

Решение №2:

Добавить параметр -b, который создает локальную ветку с удаленного

git checkout -b origin/Feature/f1234 или

git checkout -b Feature/f1234 он автоматически возвращается к исходному состоянию

Ответ 3

попробуйте

git reflog 

это дает вам историю того, как ваши указатели HEAD и branch где перемещено в прошлом.

например.

88ea06b HEAD @{0}: checkout: переход от DEVELOPMENT к пульту/оригиналу/SomeNiceFeature e47bf80 HEAD @{1}: pull origin РАЗРАБОТКА: ускоренная перемотка вперед

верхняя часть этого списка - одна из тех, кто может столкнуться с DETACHED HEAD state... проверка удаленной ветки отслеживания.

Ответ 4

Это может произойти, если вы попытаетесь отменить изменения, сделанные вами, переустановив файлы и не получив правильного синтаксиса.

Вы можете посмотреть результат git log - вы могли бы вставить хвост журнала здесь с момента последнего успешного фиксации, и мы все могли видеть, что вы сделали. Или вы можете вставить его в корзину и спросить в #git на freenode IRC.

Ответ 5

Это может произойти, если у вас есть тег с именем, аналогичным ветке.

Пример: если "release/0,1" - это имя тега, то

git checkout release/0.1

производит отсоединенную головку в положении "выпуск/0,1". Если вы ожидаете, что release/0.1 будет именем ветки, вы получите путаницу.

Ответ 6

Простым случайным способом является git checkout head как опечатка HEAD.

Попробуйте следующее:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

который дает

Note: checking out 'head'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 9354043... Readme

Ответ 7

Другой способ войти в состояние git отсоединенного состояния - попытаться зафиксировать удаленную ветку. Что-то вроде:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

Обратите внимание, что если вы сделаете это, любая дальнейшая попытка проверить происхождение /foo вернет вас обратно в состояние отдельной головы!

Решение состоит в том, чтобы создать собственную локальную ветвь foo, которая отслеживает начало /foo, а затем необязательно нажмите.

Это, вероятно, не имеет ничего общего с вашей исходной проблемой, но эта страница высоко подходит для хитов google для "git отдельно взятой головы", и этот сценарий сильно задокументирован.

Ответ 8

Когда вы извлекаете коммит git checkout <commit-hash> или в удаленную ветку, ваш HEAD отключается и пытается создать на нем новый коммит.

Запреты, недоступные для какой-либо ветки или тега, будут собираться и удаляться из хранилища через 30 дней.

Другой способ решить эту проблему - создать новую ветку для вновь созданного коммита и оформить заказ. git checkout -b <branch-name> <commit-hash>

В этой статье показано, как вы можете перейти в отдельное состояние HEAD.