Что такое HEAD в git простыми словами?
Постоянно встречаю HEAD в командах: HEAD~1, git reset HEAD, «detached HEAD». Не понимаю, что это вообще такое. Объясните простыми словами, что значит HEAD в гите.
2 ответа
HEAD — это указатель «где я сейчас нахожусь» в репозитории. Проще говоря, это закладка на текущий коммит (обычно на конце текущей ветки).
Когда ты делаешь коммит — он добавляется туда, куда показывает HEAD, и HEAD сдвигается на него. Когда переключаешь ветку — HEAD переезжает на её конец.
Очень полезен синтаксис относительных ссылок:
HEAD— текущий коммит (где ты стоишь).HEAD~1— на один коммит назад (родитель).HEAD~2— на два коммита назад. И так далее.
Поэтому команды читаются логично:
git reset --soft HEAD~1
= «откатить на один коммит назад от текущего».
git diff HEAD
= «показать, чем рабочая папка отличается от текущего коммита».
А «detached HEAD» (отсоединённая голова) — это когда HEAD указывает не на ветку, а прямо на конкретный коммит. Бывает, когда ты делаешь git checkout <хеш> для просмотра старой версии.
Частая путаница: думать, что HEAD~1 — это «первый коммит» или «коммит номер 1». Нет: тильда ~ означает «назад относительно текущего». HEAD~1 — это предыдущий коммит, а не самый первый в истории.
Аналогия: представь книгу (историю коммитов) и закладку в ней. HEAD — это закладка, показывающая, на какой странице (коммите) ты сейчас.
- Сделал коммит — закладка переехала на новую страницу.
HEAD~1— «на страницу раньше».- Сменил ветку — переложил закладку в другую главу.
Есть ещё HEAD^ — почти то же, что HEAD~1 (родитель). Различие проявляется только на merge-коммитах с двумя родителями, новичку об этом можно пока не думать.