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

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

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

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

16 ответов


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

вы можете увидеть, на что указывает голова, делая:

cat .git/HEAD

В моем случае, вывод такой:

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

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


цитата других людей:

голова-это просто ссылка на объект фиксации. У каждой головы есть имя (имя ветви или имя бирки, etc). От по умолчанию, есть голова в каждом репозиторий называется master. Хранилище может содержать любое количество глав. На в любой момент времени выбирается одна голова как "нынешний руководитель"."Это голова aliased to HEAD, always in capitals".

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

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


Я рекомендую это определение от разработчика GitHub Scott Chacon [прямая ссылка]:

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

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


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

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

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

$ git branch testing 

это создает новый указатель на ту же фиксацию, на которой вы сейчас находитесь

enter image description here

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

enter image description here


предполагая, что это не особый случай под названием "отделенная голова", тогда, как указано в книге О'Рейли Гита, 2-е изд., стр. 69,HEAD означает:

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

так

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

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


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

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

обратите внимание, однако, что в предстоящей версии 1.8.4 Git,@ также может использоваться в качестве стенографии для HEAD, as отмечено Git автор Junio C Hamano в своем блоге git Blame:

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

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

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


посмотри создание и игра с ветвями

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

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

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

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

enter image description here


Я бы хотел подробно некоторые вещи принято отвечать Грег Hewgil по. Согласно Git Карманный Гид

отрасли:

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

руководитель: специальный тип Ref

специальная головка ref определяет, какая ветвь вы на...

Refs

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

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

Как упоминал Грег, голова может быть в "отстраненном состоянии". Поэтому голова может быть либо a простой ref (для отдельно стоящей головы) или symref.

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


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

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


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


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

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

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


Head указывает на кончик текущей проверенной ветви.

enter image description here

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


похоже на то HEAD - Это просто тэг для последнего коммита, который вы проверили.

это может быть кончик определенной ветви (например, "master") или некоторая промежуточная фиксация ветви ("отдельная головка")


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

глава

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

глава

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


взгляните на http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is

рис. 3-5. Главный файл указывает на ветку, на которой вы находитесь.


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

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

Это также верно для ртутный.