【Git】コミット前に最終確認!ステージング済みの変更を差分表示する『git diff –cached』の使い方

Git/GitHub

はじめに

Gitを使っていると、「コミットする前に、今ステージングされている変更が本当に意図したものか確認したい」という場面によく遭遇しますよね。特に複数のファイルを変更し、その一部だけをステージングした場合、どの変更がコミットされるのかを正確に把握するのは重要です。

この記事では、そんな時に役立つGitコマンドgit diff --cached(またはgit diff --staged)の使い方を、初心者の方にも分かりやすく解説します。具体的なサンプルコードと共に、その挙動と活用方法を見ていきましょう。

Git Diffの基本をおさらい

git diffコマンドにはいくつか種類があり、それぞれ比較する対象が異なります。まずは、git diff --cachedを理解するための前提知識として、基本的なgit diffコマンドの挙動を簡単に確認しておきましょう。

  • git diff(引数なし)

    作業ディレクトリ(Working Directory)の変更内容と、ステージングエリア(Index)の変更内容を比較します。つまり、「まだステージングされていない変更」を表示します。

    git diff
  • git diff HEAD

    作業ディレクトリ(Working Directory)の変更内容と、最新のコミット(HEAD)の変更内容を比較します。つまり、「最新コミット以降のすべての変更(ステージング済み・未ステージング問わず)」を表示します。

    git diff HEAD

git diff --cachedとは?

本題のgit diff --cachedは、ステージングエリア(Index)の変更内容と、最新のコミット(HEAD)の変更内容を比較します。

簡単に言うと、

  • 「次にコミットされる予定の変更が、前回のコミットからどう変わったか」

を確認するためのコマンドです。git diff --stagedも全く同じ挙動をします。

git diff --cached
# または
git diff --staged

このコマンドを使うことで、実際にコミットを実行する前に、コミットされる内容を最終確認できるため、意図しない変更がコミットされてしまうのを防ぐことができます。

実践!git diff --cachedの使い方

それでは、具体的なシナリオでgit diff --cachedの挙動を確認してみましょう。

1. リポジトリの初期化と初回コミット

まず、新しいディレクトリを作成し、Gitリポジトリを初期化して最初のコミットを行います。

# 作業ディレクトリを作成し移動
mkdir git_diff_example
cd git_diff_example

# Gitリポジトリを初期化
git init

# ファイルを作成し、内容を記述
echo "This is the first line." > example.txt
echo "This is the second line." >> example.txt

# ファイルをステージングし、コミット
git add example.txt
git commit -m "Initial commit: Add example.txt"

2. ファイルの変更とステージング

次に、example.txtに2段階の変更を加えます。

  1. 最初の変更をステージングする。
  2. さらに変更を加え、これはステージングしないでおく。
# 最初の変更: 3行目を追加
echo "This is the third line (staged)." >> example.txt

# この変更をステージング
git add example.txt

# 2番目の変更: 4行目を追加(まだステージングしない)
echo "This is the fourth line (unstaged)." >> example.txt

この時点で、example.txtの内容は以下のようになっています。

This is the first line.
This is the second line.
This is the third line (staged).
This is the fourth line (unstaged).

そして、Gitの状態は以下の通りです。

  • ステージングエリアには「3行目の追加」が登録されている。
  • 作業ディレクトリには「4行目の追加」があり、これはまだステージングされていない。

3. 各種git diffコマンドの挙動を確認

この状態から、それぞれのgit diffコマンドを実行してみましょう。

git diff(引数なし):ステージングされていない変更を表示

git diff

出力例:

diff --git a/example.txt b/example.txt
index 235e23c..598b04a 100644
--- a/example.txt
+++ b/example.txt
@@ -2,3 +2,4 @@
 This is the second line.
 This is the third line (staged).
+This is the fourth line (unstaged).

解説: git diffは、作業ディレクトリとステージングエリアの差分を表示します。ここでは「This is the fourth line (unstaged).」が作業ディレクトリにのみ存在するため、この行が追加された差分として表示されています。

git diff --cached:ステージングされている変更を表示

git diff --cached

出力例:

diff --git a/example.txt b/example.txt
index 822161b..235e23c 100644
--- a/example.txt
+++ b/example.txt
@@ -2,2 +2,3 @@
 This is the second line.
+This is the third line (staged).

解説: git diff --cachedは、ステージングエリアと最新コミットの差分を表示します。ここでは「This is the third line (staged).」がステージングエリアにのみ存在するため、この行が追加された差分として表示されています。これが、次にコミットされる内容です。

git diff HEAD:最新コミット以降のすべての変更を表示

git diff HEAD

出力例:

diff --git a/example.txt b/example.txt
index 822161b..598b04a 100644
--- a/example.txt
+++ b/example.txt
@@ -2,2 +2,4 @@
 This is the second line.
+This is the third line (staged).
+This is the fourth line (unstaged).

解説: git diff HEADは、作業ディレクトリと最新コミットの差分を表示します。ここでは「This is the third line (staged).」と「This is the fourth line (unstaged).」の両方が最新コミット以降に追加された変更であるため、すべて表示されています。

まとめ

git diff --cachedは、コミット前に「何がコミットされるのか」を正確に把握するための非常に強力なコマンドです。特に、部分的に変更をステージングする場合や、複数回の変更を経てコミット内容が複雑になった場合に、その真価を発揮します。

このコマンドを日常的に活用することで、意図しない変更のコミットを防ぎ、よりクリーンで安全なGit運用が可能になります。ぜひ、あなたの開発ワークフローに取り入れてみてください。

コメント

タイトルとURLをコピーしました