Ветвление
1Что такое ветки и зачем они нужны2Слияние веток и конфликты3Конфликты слияния4Стратегии слияния: fast-forward, no-ff, squash5Detached HEAD: что это и как исправить← вы здесь
📖 Полная статья по теме →
Урок 5~12 минут

Detached HEAD: что это и как исправить

HEAD detached at abc1234 — одно из самых пугающих сообщений для новичков. На самом деле всё просто.

Как устроен HEAD

В норме HEAD указывает на ветку, а ветка — на коммит:

HEAD → main → коммит C

В detached HEAD, HEAD указывает напрямую на коммит:

HEAD → коммит C (минуя ветку)

Как попасть в detached HEAD

bash
# Checkout конкретного коммита
git checkout abc1234
 
# Checkout тега
git checkout v1.0
 
# Checkout remote ветки без создания локальной
git checkout origin/main

Git честно предупредит:

Note: switching to 'abc1234'.
You are in 'detached HEAD' state...

Что можно делать

Читать файлы, запускать код, делать коммиты — всё работает. Но:

HEAD → C → D → E   ← твои новые коммиты
               ↑ никакая ветка не знает об этих коммитах!

Когда переключишься на main, коммиты D и E станут недостижимы и будут удалены сборщиком мусора.

Как сохранить работу

Создай ветку до переключения:

bash
# Вариант 1: современный синтаксис
git switch -c feature/my-experiment
 
# Вариант 2: классический
git checkout -b feature/my-experiment

Теперь ветка указывает на твои коммиты — они в безопасности.

Если уже переключился

Если уже ушёл с detached HEAD и хочешь вернуть коммиты, используй git reflog:

bash
git reflog
# abc1234 HEAD@{1}: commit: feat: моя работа
# ...
 
git switch -c recovery abc1234   # создать ветку из потерянного коммита

reflog хранит историю всех перемещений HEAD — обычно 90 дней.

Когда detached HEAD полезен

  • Посмотреть как выглядел проект в конкретный момент
  • Запустить старую версию для отладки
  • Сделать одноразовый эксперимент без создания ветки
bash
git checkout v1.0     # смотришь старую версию
# ... изучаешь ...
git switch main       # возвращаешься, ничего не меняя

Команды

bash
git log --oneline        # найти хэш нужного коммита
git checkout abc1234     # войти в detached HEAD
git switch -c new-branch # создать ветку из detached HEAD
git switch main          # выйти, потеряв uncommitted изменения
git reflog               # найти потерянные коммиты
Detached HEAD — не ошибка, это режим 'только чтение'. Коммиты можно делать, но они потеряются после переключения на ветку. Создай ветку если нужно сохранить работу.
🌿
Визуализация ветокшаг 0 / 6
a1b2c3Initial commitd4e5f6Add README7g8h9iAdd login feat…mainHEAD
УГЛУБЛЁННОЕ ЧТЕНИЕ
Полная статья: Ветвление
Теория, примеры и разбор темы в одном месте