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.
В этом состоянии можно исследовать город: осмотреться, сравнить что-то, изучить историю. Обычно такие старые города заброшены не просто так, поэтому делать там особо нечего. Но при желании можно начать строительство прямо отсюда: проложить новые пути (создать новую ветку) от этого старого города. Можно даже построить новый город (новый коммит), но он останется отрезанным от мира, пока к нему не проложат пути (новую ветку).
.gitignoregit checkoutgit configgit taggit worktree