Почему мой репозиторий Git перешел в отключенное состояние HEAD? - PullRequest
348 голосов
/ 19 октября 2010

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

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

Итак, как я получил detached HEAD?

Ответы [ 8 ]

243 голосов
/ 19 октября 2010

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

См. фиксация с отключенным HEAD

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

alt text

Например, если вы извлекаете «удаленную ветку», не отслеживая ее в первую очередь, вы можете получитьс отсоединенной ГОЛОВКОЙ.

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

94 голосов
/ 23 апреля 2015

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

  1. перечисляет удаленные ветви

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

    git checkout origin/Feature/f1234
    
  3. 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 автоматически вернется к началу

12 голосов
/ 04 мая 2015

try

git reflog 

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

например:

88ea06b HEAD @ {0}: checkout: переход от DEVELOPMENT к remotes / origin / SomeNiceFeature e47bf80 HEAD @ {1}: pull origin DEVELOPMENT: быстрая перемотка вперед

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

8 голосов
/ 19 октября 2010

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

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

5 голосов
/ 28 сентября 2017

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

Пример: если «release / 0.1» является именем тега, то

git checkout release/0.1

создает отдельный HEAD при «release / 0.1».Если вы ожидаете, что release / 0.1 будет именем ветви, то вы запутаетесь.

3 голосов
/ 08 июня 2017

Простой случайный способ - сделать 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
1 голос
/ 28 мая 2016

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

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

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

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

Это, вероятно, не имеет ничего общего с вашей первоначальной проблемой, но эта страница содержит множество посещений Google для "git detached head", и этот сценарий недостаточно документирован.

0 голосов
/ 07 мая 2018

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

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

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

Эта статья иллюстрирует, как вы можете добраться до отсоединенного HEAD состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...