Файл HEAD находится в корне (поиск .git / HEAD), а его содержимое представляет собой «указатель -> на ссылку -> коммита» в конце текущей ветви.
На главном филиале:
$ cat .git/HEAD
ref: refs/heads/master
В выпуске №99:
$ cat .git/HEAD
ref: refs/heads/issue_99
Как видите, HEAD содержит указатель на другую ссылку.
Вы можете получить это значение также с помощью:
$ git symbolic-ref HEAD
refs/heads/issue_99
Если вы загляните внутрь ссылки назначения, вы получите значение SHA-1:
$ cat .git/refs/heads/issue_99
92fff2a187ff1a35fa8a721c31465fad289998bb
Когда вы фиксируете объект, он принадлежит ветви, в которой вы находитесь (проблема_99), и эта ветвь имеет отпечатки пальцев с помощью SHA-1, который вы видите здесь.
Проще говоря, HEAD означает «текущая ветвь», определяя указатель на ссылку.
Когда вы оформляете заказ, вы просто обновляете этот указатель.
См .: git reference
Для лучшего понимания загляните внутрь .git / refs: он содержит ссылки на хеши объектов в удобочитаемом формате.
Итак, внутри этого каталога вы найдете ветки, пульты и метки.
В моем случае:
$ ls -F .git/refs/
heads/ remotes/ tags/
Обратите внимание, что заголовки содержат файлы, названные как мои локальные ветви, в хранилище.
В нашем примере:
$ ls .git/refs/heads/
issue_99 master
Они содержат хеш коммита, который вы обычно видите:
git log -1 issue_99
commit 92fff2a187ff1a35fa8a721c31465fad289998bb
Author: deeper-x <albertodeprezzo@gmail.com>
Date: Mon Jan 7 10:46:13 2019 +0100
fancy description of fooBar commit
Возвращаясь к нашему файлу .git / HEAD, вы понимаете, почему это считается «специальной» ссылкой: она символически ссылается на конец текущей ветви (на «ref» внутри refs / container).
Теперь вы понимаете, почему, например, когда вы хотите удалить файл со стадии (untage), управляющий изменениями, вы используете:
git reset HEAD myFooBar.c
Легко понять, что происходит: HEAD является последним коммитом текущей ветви, и вы просто сбрасываете его, не касаясь файла.