Сегодня у меня была отстраненная голова, та же проблема, которая описана в: git push говорит, что все в курсе, хотя у меня есть локальные изменения
Насколько я знаю, я не делал ничего необычного, только коммитил и отталкивал от моего локального репо.
Так, как я закончил с detached HEAD
?
branch-name@{n}
n-й предыдущей позицииbranch-name
. Но несмотря ни на что, в какой-то момент должно было бытьgit checkout <rev>
. Если это не звучит как колокольчик, то, вероятно, вы сделали то, что упомянул Уилл - попытались сделатьgit checkout <file>
и смогли указать ревизию случайно.git status
:all conflicts fixed: run "git rebase --continue"
git checkout remotes/origin/my-branch
вместоgit checkout my-branch
илиgit checkout origin/my-branch
.Ответы:
Любая проверка коммита, который не является именем одной из ваших веток, даст вам отдельную ГОЛОВУ. SHA1, который представляет вершину ветви, все еще дает отделенную ГОЛОВУ. Только проверка названия локального филиала позволяет избежать этого режима.
Смотрите совершение с отстраненной головой
Например, если вы извлекаете «удаленную ветку», не отслеживая ее в первую очередь, вы можете получить отсоединенную головку.
Смотрите git: переключите ветку без отсоединения головы
С Git 2.23 (август 2019 г.) вам больше не нужно вводить в заблуждение
git checkout
команду .git switch
Также можно оформить ветку и получить отсоединить ГОЛОВУ, кроме:--detach
опцияВидеть:
Против используя новый
git switch
команду:Если вы хотите создать новую локальную ветку, отслеживающую удаленную ветку:
Нет больше ошибки!
Нет больше нежелательной головы!
источник
git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage.
что означает «файлы копируются на сцену»? Я думал, что файлы зафиксированы, что означает, что сцена очищена?master
на то, что находится наed489
диаграмме выше,git checkout ed489
вы получите отдельную ГОЛОВКУ, аgit checkout master
не -."You can think of this as an anonymous branch"
:) Мне нравится аналогияЯ воспроизвел это только сейчас случайно:
списки удаленных филиалов
Я хочу оформить заказ на месте, поэтому я вырезал пасту:
Presto! Отделенное состояние HEAD
Решение № 1:
Не включать
origin/
в начало моей спецификации ветки при проверке:Решение № 2:
Добавить
-b
параметр, который создает локальную ветку с удаленногоgit checkout -b origin/Feature/f1234
илиgit checkout -b Feature/f1234
он автоматически вернется к исходному состояниюисточник
git checkout -b Feature/f1234
<=>git branch Feature/f1234
иgit checkout Feature/f1234
.origin/branchname
, он ищет,origin/origin/branchname
что первым является удаленное имя, которое вы используете-b
, если вы не создадитеanonymous
ветвь, которая отсоединена. Точно так же для проверки с другого пульта вы должны упомянуть-b
параметр, иначе у git нет способа узнать, что это с нового пульта, он будет искатьorigin/remote/branchname
.пытаться
это дает вам историю того, как ваши заголовки и указатели веток перемещались в прошлом.
например:
88ea06b HEAD @ {0}: оформление заказа: переход от DEVELOPMENT к удаленным устройствам / origin / SomeNiceFeature e47bf80 HEAD @ {1}: извлечение источника DEVELOPMENT: ускоренная перемотка вперед
верхняя часть этого списка - одна из причин, по которой можно встретить состояние DETACHED HEAD ... проверить ветку удаленного отслеживания.
источник
Это может легко произойти, если вы попытаетесь отменить внесенные вами изменения, повторно извлекая файлы и не совсем понимая синтаксис.
Вы можете посмотреть на вывод
git log
- вы можете вставить хвост журнала сюда со времени последнего успешного коммита, и мы все увидим, что вы сделали. Или вы можете вставить его и красиво спросить#git
на IRC-сервере freenode.источник
Это может произойти, если у вас есть тег с именем, аналогичным ветви.
Пример: если «release / 0.1» является именем тега, то
выдает отдельную ГОЛОВКУ при «выпуске / 0,1». Если вы ожидаете, что release / 0.1 будет именем ветви, то вы запутаетесь.
источник
Detached HEAD
означает, что то, что в настоящее время проверено, не является локальной ветвью.Некоторые сценарии, которые приведут к
Detached HEAD
состоянию:Если вы заказываете удаленную ветку , скажем
origin/master
. Это ветка только для чтения. Таким образом, при создании коммитаorigin/master
он будет свободно плавающим , т.е. не связан ни с одной веткой.Если вы извлекаете конкретный тег или фиксируете . Когда вы делаете новый коммит отсюда, он снова будет свободно плавающим , то есть не связанным ни с одной веткой. Обратите внимание, что когда ветка извлекается, новые коммиты всегда автоматически помещаются в подсказку.
Если вы хотите вернуться назад и извлечь определенный коммит или тэг, чтобы начать работать оттуда, вы можете создать новую ветку, исходящую из этого коммита, и переключиться на нее
git checkout -b new_branch_name
. Это предотвратитDetached HEAD
состояние, поскольку теперь у вас есть проверенная ветвь, а не фиксация.источник
Простой случайный способ -
git checkout head
это опечаткаHEAD
.Попробуй это:
который дает
источник
checkout -b
которые выглядят как оформление заказа, но на самом деле ветки), но другой список просто приветствуется.Другой способ войти в состояние git - это попытаться зафиксировать удаленную ветвь. Что-то вроде:
Обратите внимание, что если вы сделаете это, любая дальнейшая попытка извлечения origin / foo вернет вас обратно в отдельное состояние головы!
Решение состоит в том, чтобы создать свою собственную локальную ветку foo, которая отслеживает origin / foo, а затем при необходимости нажать.
Вероятно, это не имеет ничего общего с вашей первоначальной проблемой, но на этой странице много хитов Google для "git detached head", и этот сценарий недостаточно документирован.
источник
Когда вы извлекаете коммит
git checkout <commit-hash>
или в удаленную ветку, ваш HEAD отключается и пытается создать новый коммит на нем.Запреты, недоступные для какой-либо ветви или тега, будут собираться и удаляться из хранилища через 30 дней.
Еще один способ решить эту проблему - создать новую ветку для вновь созданного коммита и оформить заказ.
git checkout -b <branch-name> <commit-hash>
Эта статья иллюстрирует, как вы можете добраться до отдельного состояния HEAD .
источник