`HEAD` реализован в виде файла? - PullRequest
0 голосов
/ 09 января 2019

HEAD является символом текущей ветви.

Я думал, что это реализовано как файл ref/heads/HEAD (точно так же, как master реализовано как ref/heads/master), но такого файла нет.

Реализован ли HEAD в виде файла?

1 Ответ

0 голосов
/ 09 января 2019

Файл 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 является последним коммитом текущей ветви, и вы просто сбрасываете его, не касаясь файла.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...