В этом посте давайте разберемся с указателем HEAD в Git вместе с людьми из Designveloper. Git поддерживает ссылочную переменную с именем HEAD. Все столицы, H-E-A-D. Мы называем эту переменную указателем. Что он делает, так это ссылается (или указывает) на конкретную фиксацию в репозитории. По мере того, как мы делаем новые коммиты, указатель изменяется (или перемещается), указывая на последний новый коммит.

HEAD (указатель) всегда указывает на конец нашей текущей ветки в репозитории. HEAD репозитория не имеет ничего общего с промежуточным индексом или рабочим каталогом. Это просто способ отслеживания текущей позиции в репозитории. Хорошим примером использования HEAD является головка воспроизведения и записи на кассетном магнитофоне. Когда мы начинаем записывать звук, лента проходит мимо головы и записывает на нее данные. Когда мы нажимаем кнопку «Стоп», место, где останавливается эта записывающая головка, также является местом, где она снова начнет запись, если мы нажмем кнопку «Запись» во второй раз.

Теперь мы можем перемещаться, а также перемещать голову в разные места, мы можем быстро перематывать вперед и назад. Когда мы снова нажмем кнопку «Запись», где бы ни находилась головка, она начнет запись. Указатель HEAD в Git очень похож. Он указывает на место, где мы собираемся начать запись дальше. Это место, где мы остановились в нашем репозитории с тем, что мы совершили.

Давайте взглянем на некоторые иллюстрации, которые прояснят это. В последнем посте мы увидели, как мы можем ссылаться на них, используя значения SHA.

Те 40-символьные уникальные значения, которые привязаны к этим снимкам. Давайте разберем это, просто чтобы упростить иллюстрацию и использовать первые шесть символов каждого из этих SHA. Итак, здесь мы видим одни и те же SHA, связанные вместе в виде серии коммитов.

В: Можете ли вы угадать, куда указывает HEAD после того, как мы сделали эти три коммита?

Он указывает на конец текущей ветки в нашем репозитории. Это последний коммит, который мы сделали. Это родитель следующего коммита, который мы делаем. Итак, мы делаем еще один коммит, он будет прикреплен к концу там, после a614b5.

Это станет родителем. ГОЛОВА становится особенно важной, когда мы начинаем рассматривать ветки. Ветки — это более сложная тема, которую мы не будем затрагивать в этом посте, но давайте коснемся здесь некоторых ее основ.

По умолчанию ветка, над которой мы работаем, называется основной веткой, и это наша основная ветка. Итак, давайте пройдемся по ветке master и посмотрим, как перемещается указатель HEAD, когда мы делаем наши коммиты.

Начнем с нашего первого коммита 5c15e8. В начале указатель HEAD указывает на этот 5c15e8. Затем, когда мы делаем новый коммит, он знает, что родителем будет 5c15e8. Git пропустит все это через алгоритм хэширования SHA, чтобы создать новую фиксацию с новым SHA, и переместит указатель HEAD, чтобы он указывал на эту последнюю фиксацию (38e73d). Теперь это верхушка нашей ветки master. А затем, когда мы делаем еще один (a614b5), он делает то же самое и снова перемещает указатель головы. В нашей метафоре это как будто сдвинуло головку магнитофона.

В Git у нас есть возможность создавать новые ветки, то есть создавать новый набор кода из того, над чем мы работаем, и он будет отделен от нашей главной ветки. Мы узнаем, как это сделать, в другом посте. Но пока давайте просто скажем, что у нас есть новая ветка, и эта новая ветка начнет двигаться и будет иметь свои собственные коммиты.

Когда мы делаем первый коммит, HEAD перемещается на этот коммит. А затем, когда мы делаем еще один коммит, HEAD перемещается на него. И так далее. Конечно, у нас есть возможность перемещать ГОЛОВКУ туда-сюда по разным веткам, чтобы мы могли писать на разные ветки, в зависимости от того, где находится головка.

Git будет следить за перемещением HEAD для нас. Это не то, о чем нам нужно беспокоиться. Но чтобы понять его глубже и увидеть, где он существует, давайте взглянем на папку .git (скрытую) внутри нашего проекта.

Внутри мы увидим, что есть файл с именем HEAD, написанный заглавными буквами. Это всего лишь простой файл, давайте посмотрим, что внутри него.

Там написано, ссылка: refs/heads/master. Что он делает, так это говорит ему, что он может найти эту информацию в этом каталоге refs. Итак, давайте посмотрим, что находится в этом каталоге. Введите cat refs/heads/master и нажмите Enter.

И посмотрите, что из этого выйдет. Это дает нам значение SHA.

В: Каково это значение SHA?

Давайте вызовем git log и посмотрим на нашу первую фиксацию. Посмотрите на это, это точно совпадает.

Итак, он отслеживает HEAD прямо здесь, в этом файле, и говорит нам посмотреть на этот другой файл, refs/heads/master, чтобы узнать, на что он указывает. Если бы мы поменяли ветки, то ГОЛОВА указывала бы на конец другой ветки.

Мы видим, что Git сообщает нам прямо здесь, в журнале, что HEAD прямо сейчас указывает на master. Большую часть времени нам не нужно самим манипулировать HEAD. Git позаботится об этом за нас. Но полезно знать о концепции и понимать, что git делает под крючком.

Вывод

Существует указатель с именем HEAD, который по сути представляет собой переменную, которую Git использует для отслеживания кончика текущей ветки в репозитории. Когда мы делаем новые коммиты, указатель перемещается на последний новый коммит.

Исходное сообщение: Указатель HEAD в GIT: что вам нужно знать