В техническом, но совершенно конкретном смысле, HEAD
- это файл, .git/HEAD
. Он содержит либо:
- название филиала или
- идентификатор хеша коммита.
Когда HEAD
содержит хэш-идентификатор коммита, это все, что у него есть. Git называет эту ситуацию detached HEAD , и единственной доступной информацией является хеш-идентификатор коммита.
Когда HEAD
содержит название ветви, теперь у вас есть два способа спросить Git об этом:
Эй, Git, скажи мне, какой хэш-идентификатор HEAD
names. Git смотрит на HEAD
, видит, что он называет master
, затем смотрит на master
, чтобы увидеть, что ID хеша master
имен. Это ответ на ваш вопрос.
Или Эй, Git, скажи мне, какую ветку HEAD
называет. Git смотрит на HEAD
, видит, что она называет master
, и говорит master
как ответ на ваш вопрос.
Каждое имя ветви всегда содержит хэш-идентификатор ровно одного коммита, поэтому, если HEAD
содержит имя ветви, Git всегда может выполнить операцию HEAD
-to-hash-ID, выполнив два шага. Однако, когда HEAD
содержит необработанный хэш-идентификатор, попытка спросить Git, какое имя ветки он содержит, выдает ошибку:
$ git checkout --detach master
HEAD is now at 83232e3864 The seventh batch
$ git symbolic-ref HEAD
fatal: ref HEAD is not a symbolic ref
или, используя git rev-parse --symbolic-full-name
, просто печатает HEAD
:
$ git rev-parse --symbolic-full-name HEAD
HEAD
Повторное присоединение HEAD
к master
приводит к тому, что оба они дают имена ветвей:
$ git checkout master
Switched to branch 'master'
$ git symbolic-ref HEAD
refs/heads/master
$ git rev-parse --symbolic-full-name HEAD
refs/heads/master
Вот так HEAD
может быть либо именем ветви, либо хэшем коммита, кроме случаев, когда это может быть только хэш коммита.