Gitの「HEAD」とは?実務での使い方や用途も解説
GitのHEAD(ヘッド)は、今作業しているブランチの先端を指すポインターです。Gitコマンドを使う時の基準点として機能し、git diff HEADやgit reset HEAD^のように、多くのコマンドで利用されます。
この記事のまとめ
GitのHEADは、現在チェックアウトしているブランチの先端コミットを示すショートカット(シンボリック、エイリアス)です。Gitで作業する際の「現在地」として機能します。
- HEADの正体: 現在のブランチ名を格納するポインター(通常は
.git/HEADファイルに記録) - 主な使い道: 差分確認(
git diff HEAD)、コミット取り消し(git reset HEAD^)、ファイル復元(git restore --source=HEAD)など - HEADの移動: ブランチ切り替え(
git switch)やリセット(git reset)でHEADが移動する
この記事を書いている人
2017年にWebエンジニアデビュー。 技術スタックは、React, Typescript, Ruby on Rails, Terraform。 いつも使っているAIは、Claude, ChatGPT, NotebookLM。
- この記事のまとめ
- この記事を書いている人
- HEADって一体何?
- HEADが指しているものを確認する方法
- どういうときにHEADを使う?
- HEADが移動するとき
- Detached HEADとは?
- まとめ
- Q&A
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 diffとgit diff HEADの違いは?
git diffは、ステージされていない変更のみを表示します。git diff HEADは、ステージされた変更とステージされていない変更の両方を表示します。
Detached HEADになったら、どうすればいい?
作業内容を保存したい場合は、git switch -c new-branchで新しいブランチを作成してください。単に過去のコミットを確認しただけなら、git switch mainで元のブランチに戻れます。
HEADを直接編集してもいい?
いいえ、.git/HEADファイルを直接編集するのは推奨されません。Gitコマンド(git switchやgit checkout)を使ってHEADを移動させてください。
HEADを使わずに、コミットハッシュを直接指定してもいい?
はい、可能です。例えば、git diff a1b2c3dのように、コミットハッシュを直接指定できます。ただし、HEADを使う方が「現在のコミット」を簡潔に表現できるため、多くの場合で便利です。