detached head git как исправить
Почему получаю detached head?
после того как переключаюсь на ветку develop в репазитории origin :
Так вот я тут почитал, что состояние detached получаем вот так
Оно характеризуется тем, что HEAD указывает не на вершину ветки, а просто на коммит. HEAD всегда должен указывать только на вершину какой-либо ветки!
Почему тогда я получаю detached если это моя ветка?? Это ж не просто коммит.
При переключении на удаленную ветку develop получаю такое сообщение
1 ответ 1
HEAD всегда должен указывать только на вершину какой-либо ветки!
Ветка в git — это плавающий указатель на коммит. у указателя нет и не может быть никакой «вершины».
Специальный указатель HEAD вполне может указывать и не на ветку, а на конкретный коммит (т.н. detached head). как в вашем случае.
Это просто «нестандартная» ситуация, которая может понадобиться в особых случаях.
Почему тогда я получаю detached если это моя ветка?
Потому вам, скорее всего, требуется
Ответы на дополнительные вопросы, заданные в комментарии:
Краткий ответ: потому что так задумано.
Более длинный ответ требует захода очень издалека. Попробую.
Как вы (надеюсь) знаете из толстых руководств, каждый коммит содержит в себе привязку к другому, родительскому коммиту (есть два исключения: самый первый в хранилище коммит не имеет такой привязки, а т.н. коммиты слияния (merge commits) могут содержать два и более родительских коммита). Посмотреть эту информацию можно, например, так:
Если этот файл содержит хэш коммита (т.н. «состояние detached head), то этот коммит и есть родительский.
Саму процедуру создания коммита (её «технический» аспект) я описывать не буду («на полях слишком мало места» © пьер ферма), но упомяну про действие в финале этого процесса:
Если файл HEAD содержит хэш коммита («состояние detached head), то в этот файл записывается новое содержимое — хэш только что созданного коммита.
А давайте посмотрим, что выйдет в таком случае.
Вот (в частности) чтобы не создавать такой «бардак», checkout и не запишет в файл HEAD ссылку на удалённую ветку.
Другая причина (по-моему, более веская) — неопределённость действий git при командах pull / push в нашей искусственно созданной ситуации. Да, в текущей реализации git откажется что-либо делать, выдав по простыне сообщений об ошибках. Но если реализовывать какое-то поведение в такой ситуации, то каким оно должно быть? Я лично затрудняюсь с ответом. Вполне вероятно, что и у разработчиков программы такая же проблема. Вот при git checkout удалённая-ветка они и решили записывать в HEAD хэш коммита (создавая «состояние detached head»), а не ссылку на удалённую ветку (создавая неопределённость).
Да, это нормально. см. выше.
Git: как вернуться из состояния ‘detached HEAD’
Если бы кто-нибудь проверил ветка:
git checkout 760ac7e
4 ответа
Если вы помните, какая ветвь была проверена раньше (например, master ), вы можете просто
Вообще говоря: git checkout
избавит вас от этого.
Если вы не помните название последней ветви, попробуйте
Это также пытается проверить вашу последнюю проверенную ветвь.
Используйте git reflog для поиска хэшей ранее извлеченных коммитов.
У меня был этот крайний случай, когда я проверил предыдущую версию кода, в которой моя структура каталогов файлов была другой:
git checkout master не сработало:
тогда вы можете потерять свои коммиты!! Вместо этого, вы можете захотеть сделать это:
а затем объедините commits-from-detached-head в любую ветвь, которую вы хотите, чтобы не потерять коммиты.
Похожие вопросы:
Я пытаюсь получить удаленную ветку и отследить ее, но когда я это делаю: git checkout remotes/mybranch Когда я делаю git branch-a, он отображает пульты дистанционного управления/mybranch красным.
Я хочу вернуться к определенному коммиту (не только к одному файлу, но и ко всему проекту). Я попробовал: git checkout 0780033 но потом получил следующее сообщение: Вы находитесь в состоянии.
Используя Git X и, должно быть, что-то по-королевски нащупал. Похоже, несколько дней назад я создал ветвь под названием detached HEAD и посвятил себя ей. Мой обычный процесс состоит в том, чтобы.
Используя git, я хотел бы перейти в состояние detached HEAD и создать новый коммит. Затем я хотел бы создать тег и отправить как ‘detached commit’, так и тег в удаленное РЕПО. Возможно ли это? Если.
есть проблема с cocoapods/git. Я пытаюсь добавить новый модуль в проект и получить следующую проблему. Дело в том, что член команды не получил проблему, когда он попытался добавить модуль в проект.
Я новичок в GIT. Я создал виртуальный хост и настроил свой проект локально. Все ветви сайта перечислены, включая origin/sprint. я хотел переключиться на origin/sprint ветку и начать свою работу. (Я.
Я понял, что совершил в своей ветке что-то плохое, и хочу вернуться к более раннему совершению. Я подтвердил, что git checkout 8dd018c приводит меня к более раннему коммиту, к которому я хочу.
Pro Git
Страницы
четверг, 19 марта 2015 г.
Про отрубленную голову Git (detached HEAD state)
В этой статье пойдет речь про отрубленное отсоединенное состояние указателя HEAD. Надо понимать что названия веток в Git это указатели на коммиты. Имя ветки, допустим master, указывает на последний коммит в ветке master.
Существует так же множество других указателей и один из них HEAD, но это очень важный указатель. И вот о нем мы и поговорим.
И так у нас есть история коммитов
И сейчас указатель ветки master и указатель HEAD указывают на последний коммит С4 в ветке master.
То же самое можно увидеть в Git
Оба указателя master и HEAD указывают на коммит С4 (efaaf18).
Теперь передвинем указатель HEAD на коммит C2 командой
$ git checkout 7bbbd68
Вот мы и получили отрубленную отсоединеннуюый голову указатель HEAD. И Git нам любезно сообщил что снег башка попал…
На диаграмме это можно изобразить так
И Git порекомендовал нам создать новую ветку, а так же сообщил хэш коммита на который сейчас указывает HEAD.
Все это можно увидеть в Git
Посмотреть историю перемещения головы можно командой git reflog
На скрине мы так же посмотрели состояние Git и он нам (аж красным) сообщил, что башка отсоединена на коммит 7bbbd68.
Указатель HEAD по существу указывает на тот коммит, после которого будет сделан следующий коммит. И если в состоянии отрубленной головы мы сейчас сделаем еще один коммит, то у нас будет шанс потерять его, не в смысле что он будет не доступен, а что если мы не будем помнить хэш этого коммита, то мы ни когда не сможем на него переключится.
Давайте сделаем коммит и посмотрим что будет. Изменим файлик и посмотрим статус
Ну и делаем коммит
Из лога коммитов видно что сейчас HEAD указывает на коммит С5 (84b361c), но на этот коммит не указывает ни какая ветка, верней сказать ни какой указатель ветки.
Графически это можно изобразить так
Мы по прежнему находимся в состоянии detached HEAD, о чем нам все время напоминает Git. Еще раз напомню что это означает что HEAD указывает не на вершину какой-либо ветки, а просто на коммит. В нашем случае на коммит С5 (84b361c).
Выйти из состояния detached HEAD очень легко, для этого надо переключится на какую-либо ветку или создать новую ветку.
Давайте переключимся на ветку master командой git checkout master
При переключении на ветку master, Git заботливо нас предупредил, что мы оставляем 1 commit, который не присоединен ни к какой ветке. Сообщил нам имя этого коммита – С5 и его хэш – 84b361c. И посоветовал, что возможно уже самое время создать новую ветку командой
git branch new_branch_name 84b361c
Поскольку если мы сейчас не создадим ветку (указатель) на этом коммите, то мы можем его потерять.
Если сейчас дать команду просмотра лога коммитов, то мы коммит С5 в логе не увидим
Таким образом мы можем “потерять” коммит С5, если забудем его хэш. Конечно, как уже говорилось, что в Git какой-либо сделанный коммит сложно потерять (но можно). И в данном случае мы можем посмотреть историю перемещения HEAD
и в ней мы можем увидеть наш потерянный коммит, хотя мы его и не видели в истории коммитов (логе коммитов).
Теперь дадим команду
$ git branch lost_branch 84b361c
Теперь, все хорошо. На коммит С5 указывает ветка lost_branch
Графически это выглядит так
Теперь мы легко можем переключится на ветку lost_branch и состояния HEAD deatached уже не будет, поскольку HEAD уже будет указывать на вершину ветки lost_branch.
Сейчас переключение произошло безболезненно, поскольку это вполне штатная работа в Git.
Ну и покажу это состояние графически
На этом, с отсоединенной головой пока все. Хотя есть еще варианты по отделению головы в Git, но об этом как-нибудь в другой раз.
Git: How to return from ‘detached HEAD’ state
If one would checkout a branch:
git checkout 760ac7e
4 Answers 4
If you remember which branch was checked out before (e.g. master ) you could simply
to get out of detached HEAD state.
Generally speaking: git checkout
will get you out of that.
If you don’t remember the last branch name, try
This also tries to check out your last checked out branch.
Use git reflog to find the hashes of previously checked out commits.
I had this edge case, where I checked out a previous version of the code in which my file directory structure was different:
git checkout master did not work:
You may have made some new commits in the detached HEAD state. I believe if you do as other answers advise:
then you may lose your commits!! Instead, you may want to do this:
and then merge commits-from-detached-head into whatever branch you want, so you don’t lose the commits.
Not the answer you’re looking for? Browse other questions tagged git or ask your own question.
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.9.16.40224
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Detached head git как исправить
Существует так же множество других указателей и один из них HEAD. Это очень важный указатель. И вот о нем мы и поговорим.
Итак, у нас есть история коммитов:
То же самое можно увидеть в Git:
Оба указателя master и HEAD указывают на коммит С4 (efaaf18).
Теперь передвинем указатель HEAD на коммит C2 командой
$ git checkout 7bbbd68
На диаграмме это можно изобразить так:
И Git порекомендовал нам создать новую ветку, а так же сообщил хэш коммита на который сейчас указывает HEAD.
Все это можно увидеть в Git:
Посмотреть историю перемещения головы можно командой git reflog :
На скрине мы так же посмотрели состояние Git и он нам (аж красным) сообщил, что башка отсоединена на коммит 7bbbd68.
Указатель HEAD по существу указывает на тот коммит, после которого будет сделан следующий коммит. И если в состоянии перемещенного HEAD мы сейчас сделаем еще один коммит, то у нас будет шанс потерять его, не в смысле что он будет не доступен, а что если мы не будем помнить хэш этого коммита, то мы ни когда не сможем на него переключится.
Давайте сделаем коммит и посмотрим что будет. Изменим файлик и посмотрим статус
Ну и делаем коммит
Из лога коммитов видно что сейчас HEAD указывает на коммит С5 (84b361c), но на этот коммит не указывает ни какая ветка, верней сказать ни какой указатель ветки.
Графически это можно изобразить так:
Мы по прежнему находимся в состоянии detached HEAD, о чем нам все время напоминает Git. Еще раз напомню что это означает что HEAD указывает не на вершину какой-либо ветки, а просто на коммит. В нашем случае на коммит С5 (84b361c).
Выйти из состояния detached HEAD очень легко, для этого надо переключится на какую-либо ветку или создать новую ветку.
Давайте переключимся на ветку master командой git checkout master
При переключении на ветку master, Git заботливо нас предупредил, что мы оставляем 1 commit, который не присоединен ни к какой ветке. Сообщил нам имя этого коммита – С5 и его хэш – 84b361c. И посоветовал, что возможно уже самое время создать новую ветку командой:
git branch new_branch_name 84b361c
Поскольку если мы сейчас не создадим ветку (указатель) на этом коммите, то мы можем его потерять.
Если сейчас дать команду просмотра лога коммитов, то мы коммит С5 в логе не увидим:
Таким образом мы можем “потерять” коммит С5, если забудем его хэш. Конечно, как уже говорилось, что в Git какой-либо сделанный коммит сложно потерять (но можно). И в данном случае мы можем посмотреть историю перемещения HEAD:
и в ней мы можем увидеть наш потерянный коммит, хотя мы его и не видели в истории коммитов (логе коммитов).
Теперь дадим команду
$ git branch lost_branch 84b361c
Теперь, все хорошо. На коммит С5 указывает ветка lost_branch
Графически это выглядит так:
Теперь мы легко можем переключится на ветку lost_branch и состояния HEAD deatached уже не будет, поскольку HEAD уже будет указывать на вершину ветки lost_branch.
Сейчас переключение произошло безболезненно, поскольку это вполне штатная работа в Git.
Ну и покажу это состояние графически:
На этом, с отсоединенным указателем HEAD пока все. Хотя есть еще варианты по отделению указателя HEAD в Git, но об этом как-нибудь в другой раз.

















