linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/kb/Ветки и слияния/detached-head

kb/branching ── Ветки и слияния ── intermediate

Detached HEAD

Состояние, когда HEAD указывает прямо на коммит, а не на ветку. Безопасно для просмотра, но коммиты в этом режиме теряются, если не создать из них ветку.

view as markdownaka: detached

Обычно .git/HEAD содержит ссылку на ветку:

ref: refs/heads/main

В detached-режиме там лежит сам SHA коммита:

a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0

То есть HEAD не привязан ни к одной ветке. Все команды, которые пишут «в текущую ветку» (git commit, git pull), перестают иметь чёткое целевое место.

Как попасть

bash
git switch --detach v1.0          # явно, на тег
git checkout HEAD~3                # неявно, на старый коммит
git checkout origin/main           # неявно, на удалённую ветку
git checkout <sha>                 # неявно, на конкретный коммит

Все эти ситуации легитимны. Просмотреть код в момент релиза, найти бажный коммит через bisect, поэкспериментировать локально.

Что внутри безопасно

  • Читать файлы.
  • Запускать тесты, билды.
  • Делать локальные правки в рабочем дереве (но не коммитить!).

Что опасно

  • Коммитить. Коммит создастся, HEAD двинется на него - но никакая ветка на новый коммит не указывает. Как только переключишься на любую ветку, новый коммит станет недостижимым и через 30 дней пропадёт в git gc.

Если коммитил - как спасти

Создать ветку прямо из текущего HEAD:

bash
git switch -c rescue
# или
git branch rescue

Теперь rescue указывает на твои коммиты, они в безопасности. Дальше можно git switch main && git merge rescue или cherry-pick.

Подводные камни

  • Git предупреждает большим текстом при входе в detached. Не игнорируй - потом тяжелее искать «куда делись коммиты».
  • git reflog всё помнит. Даже если коммиты «потерялись», reflog покажет SHA, и можно создать ветку постфактум.
  • Прерванный git rebase иногда оставляет detached. Если видишь непонятный detached после rebase - git rebase --abort или восстанови через reflog.

§ команды

bash
git switch --detach v1.0

Явно войти в detached на тег

bash
git switch -c rescue

Создать ветку из текущего detached HEAD - спасти коммиты

bash
git status

Покажет «HEAD detached at ...» вместо «On branch ...»

§ см. также

  • branchВетка (branch)Ветка в Git - это файл в `.git/refs/heads/`, в котором лежит SHA одного коммита. Создание, переключение и удаление веток тривиальны, потому что данных в ветке - 41 байт.
  • refloggit reflogЖурнал всех движений HEAD на этой машине. По умолчанию записи про достижимые коммиты живут 90 дней, про недостижимые - 30. Главный инструмент восстановления после `reset --hard`, `--amend`, `rebase` и удаления ветки. Хранится локально в `.git/logs/`.
  • rebasegit rebaseПереписывает коммиты ветки, делая их потомками другого коммита. Создаёт новые SHA, история становится линейной. Безопасен только для веток, которые ещё никто, кроме автора, не видел.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки