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

Вы видите документацию Git, в которой говорится о таких вещах, как

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

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

Ответ 1

Вы можете думать о HEAD как о "текущей ветке". Когда вы переключаете ветки с помощью git checkout, ревизия HEAD изменяется на точку с концом новой ветки.

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

cat .git/HEAD

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

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

HEAD может ссылаться на конкретную ревизию, которая не связана с именем ветки. Эта ситуация называется отключенным HEAD.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

$ git branch testing 

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

enter image description here

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

enter image description here

Ответ 5

Предполагая, что это не особый случай, называемый "отсоединенный HEAD", тогда, как указано в книге O'Reilly Git, 2nd edtion, стр .69, HEAD означает:

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

так

HEAD "кончик" текущей ветки.

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

Ответ 6

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

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

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

Вместо того, чтобы вводить "HEAD", вы можете сказать "@", например, "git log @".

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

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

Ответ 7

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

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

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

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

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

enter image description here

Ответ 8

Я хотел бы подробно рассказать о некоторых вещах, которые принял Грег Хьюглил. В соответствии с Git Карманным руководством

Отрасль:

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

HEAD: Специальный тип Ref

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

Refs

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

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

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

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

Ответ 9

Я думаю, что "HEAD" - текущая проверка фиксации. Другими словами, "HEAD" указывает на фиксацию, которая в настоящее время проверена.

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

Ответ 10

Голова указывает на верхушку проверенной ветки.

enter image description here

В вашем репозитории есть папка .git. Откройте файл в этом месте:.git\refs \head. Код (sha-1 hash) в этом файле (в большинстве случаев master) будет самым последним коммитом, то есть кодом, который отображается в выходных данных команды git log. Дополнительная информация о папке .git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html.

Ответ 11

Отличный способ загнать домой точку, сделанную в правильных ответах, - это запустить git reflog HEAD, вы получаете историю всех мест, которые указал HEAD.

Ответ 12

Прочитав все предыдущие ответы, я все еще хотел большей ясности. Этот блог на официальном веб-сайте git http://git-scm.com/blog дал мне то, что я искал:

HEAD: указатель на последнюю фиксацию фиксации, следующий родительский

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

Ответ 13

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

Что такое 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 указывает на коммит, а не на ветку, он отсоединяется, и новый коммит не будет связан со ссылкой на ветку.

Вы можете посмотреть на это графически, если попытаетесь выполнить следующее упражнение. Запустите это из репозитория 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, однако, будет.

Ответ 14

Такое ощущение, что HEAD - это просто тег для последнего зафиксированного вами коммита.

Это может быть кончик определенной ветки (например, "master") или некоторый промежуточный коммит ветки ("detached head")

Ответ 16

Эти два могут вас смутить:

голова

Указание на названные ссылки - ветвь, недавно отправленная. Если вы не используете ссылку на пакет, главы обычно хранятся в $GIT_DIR/refs/heads/.

ГОЛОВКА

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

Ответ 17

В дополнение ко всем определениям у меня в голове застряло то, что когда вы делаете коммит, GIT создает объект фиксации в репозитории. У объектов коммитов должен быть родитель (или несколько родителей, если это коммит слияния). Теперь, как git узнает родителя текущего коммита? Таким образом, HEAD является указателем на (ссылку на) последний коммит, который станет родителем текущего коммита.

Ответ 18

Как концепция, голова является последней версией в ветке. Если у вас более одной главы на одну ветвь, вы, вероятно, создали ее при выполнении локальных коммитов без слияния, эффективно создавая неназванную ветвь.

Чтобы иметь "чистый" репозиторий, у вас должна быть одна голова для каждой ветки с именем и всегда сходиться к именованной ветке после того, как вы работали локально.

Это также верно для Mercurial.