Тестирование с отсоединенным и обычным HEAD
На предыдущих этапах мы узнали, что HEAD
обычно указывает на ветку, например, на master
. Это "нормальное" состояние. Однако HEAD
также может указывать непосредственно на конкретный коммит. Это называется состоянием "отсоединенного HEAD
" (detached HEAD).
Давайте посмотрим, как выглядит отсоединенный HEAD
. Сначала нам нужен идентификатор коммита нашего первого коммита. Мы можем получить его с помощью команды git log --oneline
:
cd ~/project/my-time-machine
git log --oneline
Вы должны увидеть вывод, похожий на следующий (ваш идентификатор коммита будет другим):
a1b2c3d (HEAD -> master) Send a message to the future
Первые семь символов (a1b2c3d
в этом примере) - это сокращенный идентификатор коммита. Скопируйте этот идентификатор.
Теперь переведем HEAD
так, чтобы он указывал непосредственно на этот коммит, используя команду git checkout
:
git checkout <your_commit_id>
Замените <your_commit_id>
на фактический сокращенный идентификатор коммита, который вы скопировали из вывода команды git log --oneline
. Например:
git checkout a1b2c3d
Вы увидите вывод, указывающий, что вы находитесь в состоянии отсоединенного HEAD
:
Note: switching to 'a1b2c3d'.
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 by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or, if you want to make this branch stay, use:
git branch <new-branch-name> <your_commit_id>
Switched to commit a1b2c3d
Теперь проверим статус снова:
git status
Вывод четко покажет, что вы находитесь в состоянии отсоединенного HEAD
:
HEAD is now at a1b2c3d Send a message to the future
nothing to commit, working tree clean
И если мы используем команду git symbolic-ref HEAD
, она выдаст ошибку, потому что HEAD
не является символической ссылкой на ветку:
git symbolic-ref HEAD
Эта команда, скорее всего, выдаст ошибку или не выдаст никакого вывода, что указывает на то, что HEAD
не является символической ссылкой.
Чтобы вернуться в нормальное состояние, когда HEAD
указывает на ветку master
, мы можем переключиться на ветку master
:
git checkout master
Вы должны увидеть вывод, похожий на следующий:
Switched to branch 'master'
Теперь команда git status
покажет, что вы вернулись на ветку master
:
git status
Вывод:
On branch master
nothing to commit, working tree clean
И команда git symbolic-ref HEAD
снова покажет символическую ссылку:
git symbolic-ref HEAD
Вывод:
refs/heads/master
Понимание различия между присоединенным HEAD
(указывающим на ветку) и отсоединенным HEAD
(указывающим непосредственно на коммит) имеет важное значение для навигации по истории проекта и выполнения продвинутых операций в Git.