Что такое HEAD в Git? - PullRequest
       76

Что такое HEAD в Git?

917 голосов
/ 21 февраля 2010

Вы видите в документации Git такие вещи, как

Ветвь должна быть полностью объединена в HEAD.

Но что такое Git HEAD точно?

Ответы [ 18 ]

694 голосов
/ 21 февраля 2010

Вы можете думать о ГОЛОВЕ как о «текущей ветви». Когда вы переключаете ветви с помощью git checkout, ревизия HEAD изменяется, чтобы указывать на вершину новой ветви.

Вы можете увидеть, на что указывает HEAD, выполнив:

cat .git/HEAD

В моем случае вывод:

$ cat .git/HEAD
ref: refs/heads/master

HEAD может ссылаться на конкретную ревизию, которая не связана с именем ветви. Эта ситуация называется отсоединенная ГОЛОВА .

165 голосов
/ 08 декабря 2010

Цитировать других людей :

Голова это просто ссылка на совершить объект. У каждой головы есть имя (название филиала или имя тега и т. д.). От по умолчанию есть голова в каждом хранилище называется мастер. Хранилище может содержать любое количество голов. В в любой момент времени выбирается одна голова как «текущая голова». Эта голова с псевдонимом HEAD, всегда заглавными буквами ".

Обратите внимание на эту разницу: «голова» (строчные буквы) относится к любому из именованные головы в хранилище; "ГОЛОВА" (верхний регистр) относится исключительно к на данный момент активный руководитель. это различие часто используется в Git документация.

Другой хороший источник, который быстро охватывает внутреннюю работу git (и, следовательно, для лучшего понимания head / HEAD), можно найти здесь . Ссылки (ref :) или заголовки или ветки могут рассматриваться как заметки, прикрепленные к коммитам в истории коммитов. Обычно они указывают на вершину серии коммитов, но их можно перемещать с помощью git checkout или git reset и т. Д.

54 голосов
/ 26 августа 2011

Я рекомендую это определение от разработчика github Скотта Чакона [ видео справка ]:

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

Целое видео даст хорошее представление о всей системе git, поэтому я также рекомендую вам посмотреть все, если есть время.

49 голосов
/ 09 марта 2015

HEAD - это просто специальный указатель, который указывает на локальную ветвь, в которой вы находитесь.

Из книги Pro Git , глава 3.1 Ветвление Git - ветви в двух словах , в разделе Создание новой ветви :

Что произойдет, если вы создадите новую ветку? Ну, это создает новый указатель для вас, чтобы двигаться. Допустим, вы создаете новую ветку называется тестированием. Вы делаете это с помощью команды git branch:

$ git branch testing 

Это создает новый указатель на тот же коммит, на котором вы сейчас находитесь

enter image description here

Как Git узнает, в какой ветке вы сейчас находитесь? Он хранит специальный указатель под названием HEAD. Обратите внимание, что это сильно отличается от концепция HEAD в других VCS, к которым вы можете привыкнуть, таких как Subversion или CVS. В Git это указатель на локальную ветку Вы в настоящее время включены. В этом случае вы все еще на мастере. Мерзавец команда ветки только создала новую ветку - она ​​не переключалась на филиал.

enter image description here

34 голосов
/ 06 мая 2014

Если предположить, что это не особый случай, называемый «отсоединенная ГОЛОВА», то, как указано в книге О'Рейли Гит, 2-е издание, с.69, HEAD означает:

HEAD всегда ссылается на самый последний коммит на текущем ветка. Когда вы меняете ветки, HEAD обновляется, чтобы ссылаться на новые последний коммит в филиале.

так

HEAD является «вершиной» текущей ветви .

Обратите внимание, что мы можем использовать HEAD для ссылки на самый последний коммит и использовать HEAD~ в качестве коммита перед подсказкой, а HEAD~~ или HEAD~2 в качестве коммита еще раньше и т. Д.

21 голосов
/ 26 июля 2013

HEAD относится к текущему коммиту, на который указывает ваша рабочая копия, то есть к коммиту, который вы в данный момент извлекли. Из официальной документации ядра Linux по указанию ревизий Git :

HEAD называет коммит, на котором вы основали изменения в рабочем дереве.

Обратите внимание, однако, что в следующей версии Git 1.8.4 @ также может использоваться как сокращение для HEAD, как отметил автор Git Джунио С. Хамано в своем блоге Git Blame * * 1015

Вместо того, чтобы вводить «ГОЛОВА», вы можете сказать «@», например, "git log @".

Пользователь переполнения стека VonC также нашел интересную информацию о том, почему @ был выбран в качестве краткой записи в его ответе на другой вопрос .

Также интересно, что в некоторых средах нет необходимости использовать заглавные буквы HEAD, особенно в операционных системах, использующих файловые системы без учета регистра, особенно в Windows и OS X.

16 голосов
/ 09 декабря 2013

Взгляните на Создание веток и игра с ними

HEAD - это файл, содержимое которого определяет, куда ссылается переменная HEAD:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

В этом хранилище содержимое файла HEAD ссылается на второй файл с именем refs /head / master . Файл refs /heads / master содержит хэш самого последнего коммита в ветви master.

В результате HEAD указывает на коммит главной ветки из файла .git / refs /heads / master .

enter image description here

14 голосов
/ 05 августа 2013

Я просто хотел бы подробно рассказать о нескольких вещах в принятом ответе Грега Хьюджила. Согласно Git Pocket Guide

Отрасль:

сама ветвь определяется как все точки, достижимые в коммите график из названного коммита («кончик» ветви).

ГОЛОВА: Специальный тип Ref

Специальная ссылка HEAD определяет, на какой ветке вы находитесь ...

Refs

Git определяет два вида ссылок или именованных указателей, которые он вызывает «рефов»:

  • Простая ссылка, которая указывает непосредственно на идентификатор объекта (обычно коммит или тег)
  • Символическая ссылка (или symref), которая указывает на другую ссылку (простую или символическую)

Как упоминал Грег, HEAD может находиться в "отсоединенном состоянии". Таким образом, HEAD может быть либо простым ref (для отдельного HEAD), либо symref.

если HEAD является символической ссылкой для существующей ветви, то вы «включены» эта ветка. Если, с другой стороны, HEAD является простой ссылкой непосредственно называя коммит его идентификатором SHA-1, тогда вы не «включены» ни в одну ветку, но скорее в режиме «отсоединенной головы», который происходит, когда вы проверяете некоторые ранее поручите изучить.

8 голосов
/ 01 марта 2019

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

Что такое HEAD?

ГОЛОВА ТЫ

HEAD - это символическая ссылка, указывающая на то, где вы находитесь в истории коммитов. Он следует за вами, куда бы вы ни пошли, что бы вы ни делали, как тень. Если вы сделаете коммит, HEAD переместится. Если вы что-то оформите, HEAD переместится. Что бы вы ни делали, если вы переместились куда-то в свою историю изменений, HEAD переместился вместе с вами. Чтобы устранить одно распространенное заблуждение: вы не можете оторваться от HEAD. Это не то, что состояние отделенного HEAD. Если вы когда-нибудь обнаружите, что думаете: «О, нет, я нахожусь в отдельном состоянии ГОЛОВА! Я потерял свою ГОЛОВУ!» Помните, это ваша голова. ГОЛОВА это ты. Вы не отсоединились от ГОЛОВКИ, вы и ваша ГОЛОВА отошли от чего-то другого.

К чему может присоединиться HEAD?

HEAD может указывать на коммит, да, но обычно это не так. Позвольте мне сказать это снова. Обычно HEAD не указывает на фиксацию. Указывает на ссылку ветвления. Он прикреплен к этой ветви, и когда вы делаете определенные вещи (например, commit или reset), присоединенная ветвь будет двигаться вместе с HEAD. Вы можете увидеть, на что он указывает, заглянув под капот.

cat .git/HEAD

Обычно вы получите что-то вроде этого:

ref: refs/heads/master

Иногда вы получите что-то вроде этого:

a3c485d9688e3c6bc14b06ca1529f0e78edd3f86

Вот что происходит, когда HEAD указывает непосредственно на коммит. Это называется отделенным HEAD, потому что HEAD указывает на что-то, кроме ссылки на ветку. Если вы делаете коммит в этом состоянии, master, больше не привязанный к HEAD, больше не будет двигаться вместе с вами. Неважно, где находится этот коммит. Возможно, вы находитесь в том же коммите, что и ваша основная ветвь, но если HEAD указывает на коммит, а не на ветку, он отсоединяется, и новый коммит не будет связан со ссылкой на ветвь. 1046 * Вы можете посмотреть на это графически, если попытаетесь выполнить следующее упражнение. Запустите это из репозитория git. Вы получите что-то немного другое, но они будут иметь ключевое значение. Когда пришло время извлекать коммит напрямую, просто используйте любой сокращенный хеш, полученный в первом выводе (здесь это a3c485d).

git checkout master
git log --pretty=format:"%h:  %d" -1
# a3c485d:   (HEAD -> master)

git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h:  %d" -1   
# a3c485d:   (HEAD, master)

ОК, здесь небольшая разница в выводе. Проверка коммита напрямую (вместо ветки) дает нам запятую вместо стрелки. Как вы думаете, мы находимся в отдельном состоянии головы? HEAD все еще ссылается на конкретную ревизию, связанную с именем ветви. Мы все еще на главной ветке, не так ли?

Теперь попробуйте:

git status
# HEAD detached at a3c485d

Неа. Мы находимся в состоянии «отсоединенная ГОЛОВА».

Вы можете увидеть то же представление (HEAD -> branch) против (HEAD, branch) с git log -1.

В заключение

HEAD это вы. Это указывает на то, что вы проверили, где бы вы ни находились. Обычно это не коммит, а ветка. Если HEAD действительно указывает на коммит (или тег), даже если это тот же коммит (или тег), на который указывает ветка, вы (и HEAD) были отсоединены от этой ветви , Поскольку к вам не прикреплена ветка, ветка не будет следовать за вами, когда вы делаете новые коммиты. HEAD, однако, будет.

6 голосов
/ 18 июля 2012

Я думаю, что 'HEAD' это текущий коммит проверки. Другими словами, «HEAD» указывает на коммит, который в данный момент извлечен.

Если вы только что клонировали и не зарегистрировались, я не знаю, на что это указывает, возможно, какое-то неверное местоположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...