git diffコマンド実践ガイド:基本から差分ファイルのzip書き出しまで

目次

git diffとは?

今回は、Gitで差分(変更点)を確認するためのコマンド「git diff」の便利な使い方を紹介します。

SourceTreeのようなGUIツールを使っていると、差分が視覚的に表示されるため非常に便利です。しかし、コマンドライン(ターミナル)でのGit操作に慣れると、GUIツールでは手順が複雑になりがちな作業も、コマンド一つで素早く実行できることがあります。

この記事では、まず `git diff` の基本的な使い方をおさらいし、次に実務で役立つ実用的な使い方を紹介していきます。

git diffの基本的な使い方

Gitコマンドは、基本的にGitで管理しているディレクトリ(プロジェクトフォルダ)内で実行します。SourceTreeをお使いなら、「端末」ボタンをクリックすると、そのプロジェクトのディレクトリでターミナルを簡単に開くことができるので活用しましょう。

SourceTreeの「端末」ボタン

1. 作業ツリーとインデックスの差分を見る

`git diff` の最も基本的な動作は、「作業ツリー(現在の作業ディレクトリ)」と「インデックス(ステージングエリア)」の間の変更点を表示することです。

// [インデックス] → [作業ツリー] の差分を見る
// (まだ git add していない変更点)
git diff
git diffの実行例1
git diffの実行例2

2. 作業ツリーと最新コミット(HEAD)の差分を見る

`git add` したかどうかに関わらず、最新のコミットから現在までのすべての変更点を見たい場合に使います。

// [最新コミット] → [作業ツリー] の差分を見る
// (git add したもの + していないもの両方)
git diff HEAD

3. インデックスと最新コミット(HEAD)の差分を見る

`git add` してインデックスに登録した変更点(= 次にコミットされる予定の変更)だけを確認したい場合に使います。

// [最新のコミット] → [インデックス] を比較する
// (git add したものだけ)
git diff --cached
git diff --cached HEAD // 上記と同じ意味

git diffの便利な使い方(実用例)

基本的な使い方は、SourceTreeなどのGUIツールで確認する方が、初心者の方には直感的で分かりやすいかもしれません。
ここからは、GUIツールよりもコマンドを使った方が効率的な、実用的な `git diff` の使い方を2つ紹介します。

HEADと指定したコミットとの差分を比較し、ファイル名だけを出力する

現在の状態(HEAD)と過去のあるコミットを比較し、変更があったファイルのリストだけを抽出できます。特定のバージョンから変更があったファイルだけをFTPでアップロードしたい時などに非常に便利です。

// cd33db4 の部分は比較したいコミットIDに置き換えてください
git diff --name-only HEAD..cd33db4

HEADと指定したコミットとの差分を比較し、変更があったファイルをZIPファイルにまとめて出力する

上記でリストアップした差分ファイルを、ディレクトリ構造を保ったままZIPファイルに書き出すコマンドです。納品ファイルやパッチファイルを作成する際に絶大な効果を発揮します。

// cd33db4 の部分は比較したいコミットIDに置き換えてください
git archive --format=zip HEAD `git diff cd33db4 --name-only` -o archive.zip

※ただし、このコマンドはコミット間で削除されたファイルがあると、「’xxxxx’ did not match any files …」というエラーが出ることがあります。その場合は、「–diff-filter」オプションを使い、削除されたファイル(Deleted = D)を対象から除外すると上手くいきます。

// 削除(D)されたファイルを除外し、追加・変更・コピー・リネームされたファイルのみを対象にする
git archive --format=zip HEAD `git diff cd33db4 --name-only --diff-filter=AMCR` -o archive.zip

※`–diff-filter` オプションの主な指定文字は以下の通りです。

  • `A`: Added (追加されたファイル)
  • `M`: Modified (変更されたファイル)
  • `D`: Deleted (削除されたファイル)
  • `R`: Renamed (リネームされたファイル)
  • `C`: Copied (コピーされたファイル)

(より詳細なオプションは公式ドキュメントを参照してください。)

--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]
Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, …​) changed (T), are Unmerged (U), are Unknown (X), or have had their pairing Broken (B). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added to the combination, all paths are selected if there is any file that matches other criteria in the comparison; if there is no file that matches other criteria, nothing is selected.

今回紹介するのはこの2点ですが、ほかにも比較対象をコミット間でなくブランチ間にしたり、`git diff –word-diff` で単語レベルの差分を表示したり、`git diff –stat` で変更の統計(どのファイルが何行変更されたか)だけを表示したりと、`git diff` には多様な使い方があります。

「この差分だけ知りたいのに、GUIツールだと手間がかかるな」と感じたら、「git diff 使い方 〇〇(やりたいこと)」などで検索してみることをおすすめします。

おまけ:SourceTreeのカスタムアクション機能

最後に、SourceTreeの「カスタムアクション機能」を使い、今回紹介したようなよく使うコマンドを登録する方法を一例として紹介します。これにより、毎回コマンドを打つ必要がなくなります。

1. あらかじめ使いたいコマンドを「.sh」(シェルスクリプト)ファイルにして、任意のフォルダに保存しておきます。(例: `create_diff_zip.sh`)

2. SourceTreeのメニューバーから「操作」→「カスタムアクション」→「編集…」と進みます。

SourceTreeのカスタムアクション編集メニュー

3. 「追加」をクリックします。

4. 「メニューキャプション」に分かりやすい名前(例: 「差分ファイルをZip書き出し」)を入力します。

5. 「実行するスクリプト」の「…」をクリックし、ステップ1で作成した「.sh」ファイルを選択します。

6. 必要があれば「パラメータ」を入力し、「OK」をクリックして登録完了です。

カスタムアクションの追加ダイアログ

次回から「操作」→「カスタムアクション」メニューに登録した名前が表示され、クリックするだけでコマンドを実行できるようになります。

参考サイト
http://www-creators.com/archives/755
https://qiita.com/shibukk/items/8c9362a5bd399b9c56be
https://qiita.com/koki-sato/items/d055417d93a3aea64f93

git diffに関するよくある質問(FAQ)

Q1: `git diff` と `git diff HEAD` の違いは何ですか?
A1: `git diff` は「まだ `git add` していない変更(作業ツリーとインデックスの差分)」を表示します。一方、`git diff HEAD` は「最新のコミットから今現在のすべての変更(`git add` 済みのものも、まだのものも含む)」を表示します。コミットする前に最終確認する場合は `git diff HEAD` を使うと便利です。
Q2: 変更したファイルだけをzipにまとめる簡単な方法はありますか?
A2: はい、記事で紹介した `git archive` と `git diff` を組み合わせたコマンドが非常に強力です。例えば、最新コミットと特定のコミット(例: cd33db4)との差分(追加・変更ファイルのみ)をzipにする場合は、以下のコマンドを使います。
git archive --format=zip HEAD \`git diff cd33db4 --name-only --diff-filter=AM\` -o archive.zip
Q3: SourceTreeを使っていますが、それでも `git diff` コマンドを覚えるメリットはありますか?
A3: はい、大いにあります。SourceTreeは視覚的に分かりやすいですが、`git diff` コマンドを使うと「変更があったファイル名だけを一覧にする」「差分ファイルだけをzipに固める」といった、GUIツールでは複数のステップが必要な作業を一行で完結できます。記事で紹介したようにSourceTreeのカスタムアクションに登録すれば、コマンドの便利さとGUIの手軽さを両立できます。

CONTACT

webサイト制作、デザインに関するご相談、御見積のご依頼など、弊社へのお問い合わせはこちら