Глиф Учебники

Что такое detached HEAD и как вернуться на ветку

Справочник · Git · 2 минуты чтения

Как вернуться на ветку

Порядок зависит от того, делали ли вы коммиты, пока были в этом состоянии.

Коммитов не делалипросто вернитесь

Bash
git switch main

Делали коммиты и хотите их сохранитьсначала создайте ветку

Bash
git switch -c experiment

Коммиты останутся в новой ветке experiment (имя может быть любым), и теперь можно спокойно вернуться: git switch main.

Что это значит

Обычно HEAD указывает на ветку, а ветка — на свой последний коммит. Detached HEAD («отсоединённый HEAD») — вы перешли прямо на коммит, а не на ветку. Так бывает после git checkout 27ca428, git checkout v1.0 (метка версии) или git checkout origin/main. Git предупреждает об этом:

Текст
Note: switching to '27ca428'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

git status в этом состоянии начинается со строки HEAD detached at 27ca428.

Ничего не сломалось: это нормальный способ посмотреть, как проект выглядел раньше, — собрать старую версию, проверить, была ли ошибка. Опасность одна: коммиты, сделанные здесь, не принадлежат никакой ветке.

Коммиты без ветки

Если сделать коммит и уйти на ветку, Git предупредит:

Текст
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  079524e Эксперимент

If you want to keep it by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 079524e

Коммит ещё цел — сохраните его, создав ветку по хешу из сообщения:

Bash
git branch experiment 079524e

Сообщение уже ушло с экрана? Найдите коммит в git reflog — по его сообщению — и создайте ветку так же. Коммиты без ветки Git через некоторое время удаляет при очистке репозитория, поэтому не откладывайте.

Без ветки такие коммиты нельзя отправить на сервер обычным git push, и о них легко забыть. Если собираетесь что-то менять в старой версии, сразу создайте ветку: git switch -c имя.

Как попасть сюда нарочно

Посмотреть старую версию, ничего не меняя:

Bash
git switch --detach 27ca428

git switch без --detach на коммит не перейдёт — он работает только с ветками, и так защищает от случайного detached HEAD. Вернуться на ветку, где были до этого, — git switch -.

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