#Что означает ошибка
You are in 'detached HEAD' state.
Состояние «detached HEAD» означает, что HEAD указывает на конкретный коммит, а не на ветку. Новые коммиты в таком состоянии не принадлежат ни одной ветке и могут потеряться после переключения. Состояние возникает при git checkout <commit>, при git checkout tag и при работе с подмодулями.
Это не ошибка, но коммиты нужно сохранить, если вы их делали.
Разберём, как выйти из состояния и спасти работу.
Состояние detached HEAD возникает, когда вы переключились на конкретный коммит, тег или удалённую ветку, а не на локальную ветку. Новые коммиты в таком состоянии легко потерять, поэтому нужно создать ветку.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Переключение на коммит или тег | git status сообщает HEAD detached at конкретном коммите/теге | Если создавали новые коммиты — сначала создайте ветку git switch -c .... |
| Переключение на удалённую ветку | После checkout удалённой ссылки HEAD не указывает на локальную ветку | Создайте отслеживающую ветку лишь когда она нужна для работы. |
| Прерванный rebase | git status сообщает rebase in progress | Не запускайте новое слияние: продолжите или отмените начатый rebase после проверки. |
| Намеренный просмотр истории | Вы намеренно смотрите старую версию и не создавали новых коммитов | Вернитесь к существующей ветке через git switch ИМЯ, если рабочие файлы сохранены. |
#Пошаговое решение
- Проверьте git statusОткройте терминал в каталоге репозитория и выполните
git statusиgit branch --show-current. НадписьHEAD detached at ...при пустом имени ветки подтверждает состояние. Затем выполнитеgit log -1 --onelineи запишите хэш текущего коммита; посмотритеgit status, нет ли несохранённых изменений. Это не повреждение Git: оно часто возникает при просмотре тега, старого коммита или в системе автоматической сборки. - Если работа не нужнаЕсли вы лишь просматривали старую версию и не делали новых коммитов, сначала убедитесь в
git status, что изменения не нужны. Посмотрите существующие локальные ветки командойgit branch --list; вернитесь в нужную, напримерgit switch main, **только если в списке действительно естьmain**. Если Git откажется из-за несохранённых файлов, не применяйте--forceи не удаляйте файлы: сохраните работу отдельным коммитом в новой ветке либо согласованнымgit stash. После переходаgit statusпокажетOn branch .... - Если есть коммитыЕсли в состоянии detached HEAD уже сделаны коммиты или внесены ценные изменения, до переключения создайте ветку из текущего состояния:
git switch -c rescue-work(название выбирайте свободное и понятное). Проверьтеgit branch --show-current— должно появитьсяrescue-work;git log --oneline -3покажет вашу историю. При незакоммиченных файлах выполнитеgit status; затем добавляйте и коммитьте только нужные изменения, а не используйте очистку рабочего каталога. - Если уже потеряли коммитыЕсли вы уже переключились, откройте тот же репозиторий и выполните
git reflog --date=local -n 30. Найдите запись с коммитом, который делали в detached HEAD (ориентируйтесь на дату и сообщение коммита); скопируйте его полный или короткий хэш. Выполнитеgit show <хэш> --statдля проверки, подставив фактический хэш, после чегоgit branch rescue-recovered <хэш>. Эта команда создаёт указатель на найденный коммит и не меняет ваши файлы; убедитесь, что новая ветка видна вgit branch --list. Если записи нет, прекратите попытки очистки Git и обратитесь за восстановлением. - Слейте ветку в основнуюОбъединение — не обязательное действие после выхода из detached HEAD. Если нужно перенести сохранённые коммиты в основную ветку, убедитесь, что рабочий каталог чистый, выберите реальную целевую ветку командой
git switch main(или другую существующую), затем просмотритеgit log --oneline --graph --allи только после этого согласованно выполнитеgit merge rescue-work. При конфликтах остановитесь, изучитеgit statusи разрешите файлы по отдельности; вариант отмены незавершённого слияния —git merge --abort, если Git его предлагает. - Дополнительная команда по темеLinux · Терминал (Bash)КомандаСоздать ветку до переключения на другую; rescue-work — пример имени, проверьте что свободно.
# Выполнять только после git status, если есть важные новые коммитыgit switch -c rescue-work
#Если коммитов не делали
Просто вернитесь на ветку: git switch main (или git checkout main). Список веток: git branch -a. Проверка состояния: git status покажет HEAD detached at abc1234. Для просмотра прошлых версий состояние безопасно: вернулись и работаете дальше.
#Если сделали коммиты
Создайте ветку из текущего места: git switch -c my-fix — коммиты сохранятся в ветке. Затем при необходимости слейте: git switch main и git merge my-fix. Если вы уже переключились и потеряли коммиты, найдите их в журнале ссылок: git reflog, выберите хэш и выполните git branch rescue <хэш>. Срок хранения записей reflog зависит от настроек и сборки мусора Git: не рассчитывайте на фиксированные 90 дней.
#Предотвращение
Для экспериментов с тегом создавайте ветку: git switch -c test v1.2.0. В подмодулях после обновления выполните git switch main внутри подмодуля и закоммитьте указатель в родительском репозитории. В CI detached HEAD нормален. Показывайте текущую ветку в приглашении командной строки (git-prompt), чтобы замечать состояние сразу.
git statusgit branch --listgit log -1 --onelinegit reflog --date=local -n 30