Ключевые концепции

HEAD

HEAD — это специальная ссылка в Git, которая указывает на коммит, на который сейчас переключено рабочее дерево. Обычно, когда ты находишься в ветке, HEAD указывает на последний коммит этой ветки. При создании нового коммита HEAD автоматически сдвигается вперёд и указывает на этот новый коммит. Если сбросить ветку к другому коммиту, HEAD тоже переместится.

Это похоже на понятие текущей директории (англ. current directory) в терминале. Как текущая директория показывает, где мы находимся в файловой системе, так и HEAD показывает, где мы находимся в истории коммитов репозитория.

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

Detached HEAD

Если бы давали приз за худшее название для концепции, состояние detached HEAD (англ. detached HEAD — отсоединённый HEAD; буквально звучит как «оторванная голова») заняло бы первое место. В Git HEAD — это не голова, а ссылка на текущий коммит, но английское название всё равно звучит так, будто что-то сломалось или запахло бедой. На самом деле это абсолютно нормальное состояние, которое можно использовать для разных задач.

О нет, у меня detached HEAD! Наверное, весь репозиторий сломался!

Давай объясню, что такое detached HEAD, на другой метафоре.


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

А теперь представь, что когда-то была ветка, ведущая в старый заброшенный город. Самих путей уже нет (ветку удалили), но город всё ещё стоит (Git хранит все коммиты).

Раз к этому старому городу больше не ведут рельсы, добраться туда можно только пешком, сойдя с путей (переключившись на коммит по его хешу). Как только доберёшься туда, ты окажешься в состоянии detached HEAD.

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