Что такое detached HEAD и как вернуться на ветку
Как вернуться на ветку
Порядок зависит от того, делали ли вы коммиты, пока были в этом состоянии.
Коммитов не делалипросто вернитесь
git switch mainДелали коммиты и хотите их сохранитьсначала создайте ветку
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Коммит ещё цел — сохраните его, создав ветку по хешу из сообщения:
git branch experiment 079524eСообщение уже ушло с экрана? Найдите коммит в git reflog — по его сообщению — и создайте ветку так же. Коммиты без ветки Git через некоторое время удаляет при очистке репозитория, поэтому не откладывайте.
Без ветки такие коммиты нельзя отправить на сервер обычным git push, и о них легко забыть. Если собираетесь что-то менять в старой версии, сразу создайте ветку: git switch -c имя.
Как попасть сюда нарочно
Посмотреть старую версию, ничего не меняя:
git switch --detach 27ca428git switch без --detach на коммит не перейдёт — он работает только с ветками, и так защищает от случайного detached HEAD. Вернуться на ветку, где были до этого, — git switch -.
Подводные камни
- Команда
git checkout origin/mainтоже даёт detached HEAD:origin/main— копия ветки с сервера, а не ваша ветка. Чтобы работать с ней, переключитесь на свою:git switch main. - Во время
git rebaseGit тоже временно находится в detached HEAD — это нормально. Завершите rebase (git rebase --continue) или отмените его (git rebase --abort). - Некоторые редакторы и программы показывают это состояние надписью вместо имени ветки — например, хешем коммита в строке состояния.