Предыдущий ролик Следующий ролик  

Видео урок: Работа с указателем HEAD

Git: обучение основам

В этом ролике мы обсудим указатель HEAD в Git. Git поддерживает ссылочную переменную, которая называется HEAD, все заглавными буквами, H-E-A-D. И мы называем эту переменную указателем, потому что ее цель заключается в том, чтобы ссылаться, или указывать, на конкретный коммит в репозитории. Когда мы делаем новые коммиты, указатель перемещается, чтобы выделить новый коммит. HEAD всегда указывает на верхушку текущего бранча в нашем репозитории. Вот это касается нашего репозитория, а не буфера или рабочей директории, мы говорим только о репозитории, о коммитах, которые мы сделали в репозиторий.

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

Мы можем перемещаться, головка тоже будет перемещаться по различным местам, но где бы головка не находилась, если мы нажмем Запись снова, именно здесь будет начинаться запись. Указатель HEAD в Git очень похож на это, он указывает на место, где мы будем начинать следующую запись. Это место, где мы оставили в нашем репозитории последние закоммиченные изменения. Давайте рассмотрим это более наглядно, и все станет ясно. В последнем ролике мы видели, как мы можем обратиться к коммитам, используя SHA значения, и я показал вам это наглядно. Я все это немного упущу и покажу вам эти три разных коммита для краткости по первым шести символам, в общем, эти три коммита будут представлены как 5c15e8, 38e73d и a614b5.

Вы знаете, куда указывает HEAD, после того как мы сделали эти три коммита? Он указывает на верхушку текущего бранча в нашем репозитории, а это последний коммит, который мы сделали, а это родительский коммит следующего коммита. Если затем будет добавлен другой коммит, тогда наш a614b5 будет родительским, а затем мы делаем новый коммит. Теперь, HEAD становится очень важным, когда мы начинаем говорить о бранчах, а бранчи мы рассмотрим немного позже, хотя сейчас давайте поговорим о некоторых основах. По умолчанию бранч, в котором мы работаем, является мастер-бранчем, то есть это основной бранч, давайте пройдемся по мастер-бранчу и посмотрим, как передвигается указатель HEAD, когда мы делаем коммиты.

Итак, мы начинаем с 5c15e8 в качестве первого коммита. На данном этапе HEAD указывает на этот коммит. Когда мы делаем новый коммит, он говорит - вот, родителем будет 5c15e8 - новый коммит вставляется, а HEAD передвигается, чтобы указать на новый коммит, верхушку нашего основного бранча. А когда мы добавляем новый коммит, указатель HEAD пермещается снова. Это похоже на то, как головка касетного проигрывателя перемещается вперед. Далее, в Git у нас есть возможность создавать новые бранчи, то есть создавать новый набор кода, с которым мы работаем, и он является отдельным от нашего основного бранча, Мы изучим это позже, а теперь, скажем, у нас есть новый бранч, и в этом новом бранче тоже нужно сделать свои собственные коммиты, которые не касаются основного бранча.

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

таким образом, HEAD всегда указывает на верхушку того бранча, где был сделан чекаут. не переживайте по поводу всех этих дел с бранчами на данный момент, мы вернемся к ним позже, а вы всегда можете вернуться и пересмотреть этот ролик, если нужно. Давайте перейдем в командную строку и посмотрим, как Git отслеживает HEAD. Я в директории first Git project, и вы помните, что внутри нее есть папка .git. Давайте переместимся в эту папку и просто заглянем сюда, вы не обязаны следовать за мной, если не хотите, вы можете просто посмотреть.

Что же есть в этой директории? А здесь есть файл с именем HEAD, и его использует Git, чтобы знать, на что указывает HEAD. И на что указывает HEAD в данный момент? Я посмотрю, что находится в файле, просто сказав cat HEAD, видите, он говорит, что ссылается на refs/heads/master, он не указывает на текущий коммит, он указывает на текущий бранч, но в этом бранче есть верхушка, и она поддерживается в этой папке refs. Таким образом, он указывает на эту папку, давайте зайдем внутрь refs, что же находится тут, вы видите, что здесь есть heads, и это говорит нам, что все внутри refs/heads и master.

Чтобы убедиться, мы идем в heads, и мы видим, что здесь есть что-то, что называется master, а если мы посмотрим на master, то увидим коммит, и это тот коммит, на который в данный момент указывает HEAD. Вот, все верно, Git говорит - вы хотите знать, на что указывает HEAD? Посмотрите в файл, который называется HEAD. HEAD говорит мне посмотреть внутрь refs/heads/master, и если мы смотрим файл в этот refs/heads/master, мы видим, что указан 7aa195bd44ea и так далее, ваш может быть другим. Что же представляет собой этот коммит? Итак, если мы посмотрим на наш лог, git log, тут будет 7aa195bd44ea.

Это первый коммит, который я сделал, и на него указывает HEAD. Вы часто можете использовать HEAD в Git в качестве ссылки на верхушку бранча, все верно. И этого мы достигаем, когда пишем git log HEAD для верхушки текущего измененного бранча. А по факту, когда я пишу git log, это то же самое, что и git log HEAD. Когда я начинаю с HEAD, я вижу логи, которые идут от HEAD в обратном порядке. Я считаю, что стоит внести ясность о том, что такое HEAD. Мне кажется, многие люди начинают работу с Git и не понимают вначале, что такое HEAD. А затем, когда он начинает позже всплывать, они видят ссылки на HEAD и не понимают, что такое вообще HEAD? Ну, а вы уже теперь знаете.

Вы знаете, что HEAD - это просто указатель, который идет к верхушке текущего бранча в репозитории.