Что такое HEAD в Git и какие у него есть состояния?

«Что такое HEAD в Git и какие у него есть состояния?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HEAD — это специальный указатель в Git, который всегда ссылается на текущий коммит в рабочем дереве. Это «точка, где вы сейчас находитесь» в истории коммитов.

Два основных состояния HEAD:

  1. Привязанный (Attached) HEAD Указывает на ветку, а ветка, в свою очередь, указывает на коммит. При создании нового коммита ветка продвигается вперед, и HEAD движется вместе с ней.

    # HEAD указывает на ветку 'main'
    $ cat .git/HEAD
    ref: refs/heads/main
  2. Отсоединенный (Detached) HEAD HEAD указывает напрямую на конкретный коммит, а не на ветку. Это состояние возникает при:

    • Переходе на конкретный тег или коммит.
    • Просмотре истории.
      # Переход в состояние detached HEAD
      $ git checkout a1b2c3d4
      Note: switching to 'a1b2c3d4'...
      You are in 'detached HEAD' state...

Практическое значение и команды:

  • Создание коммита в detached HEAD создаст новый коммит, который не будет принадлежать ни одной ветке и может быть потерян для сборщика мусора Git.
  • Чтобы сохранить изменения из detached HEAD, создайте новую ветку:
    # Находясь в detached HEAD, создать ветку от текущего коммита
    $ git branch new-feature-branch
    $ git checkout new-feature-branch
  • Команды, которые используют/меняют HEAD: git checkout, git reset, git commit, git merge.

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