← ブログ一覧

Gitの「HEAD」とは?実務での使い方や用途も解説

GitのHEAD(ヘッド)は、今作業しているブランチの先端を指すポインターです。Gitコマンドを使う時の基準点として機能し、git diff HEADgit reset HEAD^のように、多くのコマンドで利用されます。

この記事のまとめ

GitのHEADは、現在チェックアウトしているブランチの先端コミットを示すショートカット(シンボリック、エイリアス)です。Gitで作業する際の「現在地」として機能します。

  1. HEADの正体: 現在のブランチ名を格納するポインター(通常は.git/HEADファイルに記録)
  2. 主な使い道: 差分確認(git diff HEAD)、コミット取り消し(git reset HEAD^)、ファイル復元(git restore --source=HEAD)など
  3. HEADの移動: ブランチ切り替え(git switch)やリセット(git reset)でHEADが移動する

この記事を書いている人

2017年にWebエンジニアデビュー。 技術スタックは、React, Typescript, Ruby on Rails, Terraform。 いつも使っているAIは、Claude, ChatGPT, NotebookLM。



HEADって一体何?

GitのHEADは、「今、自分がどのブランチで作業しているか」を示します。

例えば、mainブランチで作業している時、HEADはmainブランチの最新コミットを指しています。この情報は、.git/HEADというファイルに記録されています。

HEADの役割

  • 現在のコミット位置を示す
  • Gitコマンドの基準点として機能する
  • 作業ディレクトリの状態と履歴をつなぐ

つまり、HEADは「今、自分がどのブランチのどの位置にいるか」を示すマーカーです。

HEADが指しているものを確認する方法

実際にHEADが何を指しているか確認するには、以下のコマンドを使います。

# HEADが指すブランチ名を確認
git symbolic-ref HEAD

# 出力例: refs/heads/main
# HEADが指すコミットのハッシュ値を確認
git rev-parse HEAD

# 出力例: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0

どういうときにHEADを使う?

Gitコマンドの多くが、HEADという表記を受け付けます。ここでは、初心者にとって特に重要なコマンドを紹介します。

差分の確認

git diff HEAD

ステージされた変更と、ステージされていない変更の両方を表示します。

git diff HEAD

このコマンドは、現在の作業ディレクトリの状態と、HEADが指すコミット(最新のコミット)との差分を表示します。

git show HEAD

現在のコミットと、その親コミットとの差分を表示します。

git show HEAD

過去のコミットの参照

HEADを基準に、過去のコミットを参照できます。

  • HEAD^: 1つ前のコミット
  • HEAD^^: 2つ前のコミット
  • HEAD~3: 3つ前のコミット
# 3つ前のコミットとの差分を表示
git diff HEAD~3

ファイルの復元

git restore --source=HEAD <file>

ステージされた変更とステージされていない変更を削除し、ファイルをHEADの状態に戻します。

# index.htmlをHEADの状態に戻す
git restore --source=HEAD index.html

# 古い書き方(git checkout)
git checkout HEAD index.html

コミットの取り消し

git reset HEAD^

直前のコミットを取り消します。ただし、作業ディレクトリの変更は保持されます。

# 最新のコミットを取り消す(変更内容は残る)
git reset HEAD^

# 最新のコミットを完全に削除(変更内容も削除)
git reset --hard HEAD^

このコマンドは、ブランチの先端(tip)を移動させることで、コミット履歴からコミットを削除します。

HEADが移動するとき

HEADは、以下の操作で移動します。

ブランチの切り替え

git switchまたはgit checkoutでブランチを切り替えると、HEADが新しいブランチの先端を指すように移動します。

# developブランチに切り替え
git switch develop

# HEADはrefs/heads/developを指す

コミットの作成

新しいコミットを作成すると、HEADが指すブランチの先端が新しいコミットに移動します。

git commit -m "新機能を追加"

# HEADが指すブランチの先端が、新しいコミットに移動

リセット操作

git resetを使うと、HEADが指定したコミットに移動します。

# HEADを2つ前のコミットに戻す
git reset HEAD~2

この操作は、ブランチの先端を移動させるため、履歴が変更されます。

Detached HEADとは?

通常、HEADはブランチ名を指していますが、特定のコミットを直接指す状態になることがあります。これを「Detached HEAD(切り離されたHEAD)」と呼びます。

Detached HEADになる状況

特定のコミットハッシュを指定してチェックアウトすると、Detached HEAD状態になります。

# 特定のコミットをチェックアウト
git checkout a1b2c3d

# 警告メッセージが表示される
# You are in 'detached HEAD' state...

Detached HEADの状態

この状態では、HEADがブランチではなく、特定のコミットを直接指しています。

cat .git/HEAD

# 出力例: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
# (ブランチ名ではなく、コミットハッシュが直接記録されている)

注意点

Detached HEAD状態でコミットを作成すると、そのコミットはどのブランチにも属しません。ブランチに戻ると、作成したコミットが失われる可能性があります。

# Detached HEAD状態から抜ける
git switch main

# または、新しいブランチを作成して作業内容を保存
git switch -c new-feature-branch

Detached HEADは、過去のコミットを確認する時や、特定のバージョンをテストする時に使われます。作業内容を保存したい場合は、必ず新しいブランチを作成してください。

まとめ

GitのHEADは、以下の特徴を持つシンボリック参照です。

基本的な役割

  • 現在のブランチの先端を指すポインター
  • .git/HEADファイルに、ブランチ名またはコミットハッシュが記録される
  • Gitコマンドの基準点として機能する

主な使用場面

  • git diff HEAD: 作業ディレクトリとの差分確認
  • git reset HEAD^: 直前のコミットを取り消す
  • git restore --source=HEAD: ファイルを最新コミットの状態に戻す
  • HEAD~3のような表記で、過去のコミットを参照

HEADの移動

  • ブランチ切り替え(git switch)でHEADが移動
  • コミット作成でブランチの先端が移動
  • リセット操作(git reset)で履歴上の位置が変わる

特殊な状態

  • Detached HEAD: HEADが特定のコミットを直接指す状態
  • この状態でのコミットは、ブランチに保存しないと失われる可能性がある

HEADを理解することで、Gitの履歴操作やファイル復元のコマンドが使いやすくなります。

Q&A

HEAD^HEAD~1は同じ意味?

はい、同じ意味です。どちらも「1つ前のコミット」を指します。HEAD^^HEAD~2と同じで、「2つ前のコミット」を指します。

git diffgit diff HEADの違いは?

git diffは、ステージされていない変更のみを表示します。git diff HEADは、ステージされた変更とステージされていない変更の両方を表示します。

Detached HEADになったら、どうすればいい?

作業内容を保存したい場合は、git switch -c new-branchで新しいブランチを作成してください。単に過去のコミットを確認しただけなら、git switch mainで元のブランチに戻れます。

HEADを直接編集してもいい?

いいえ、.git/HEADファイルを直接編集するのは推奨されません。Gitコマンド(git switchgit checkout)を使ってHEADを移動させてください。

HEADを使わずに、コミットハッシュを直接指定してもいい?

はい、可能です。例えば、git diff a1b2c3dのように、コミットハッシュを直接指定できます。ただし、HEADを使う方が「現在のコミット」を簡潔に表現できるため、多くの場合で便利です。