解説
Git管理していない二つのファイルを比較する:diff --no-indexと終了コードの読み方
設定の控えと変更案を、Gitリポジトリの外で比較しよう。--no-indexの差分表示と、違いがあると終了コード1になる意味を架空のファイルで確認する。

変更前の設定の控えと、変更案のファイルを比べたい。Gitで管理していない場所でも、git diff --no-indexなら二つのファイルの差分を表示できるよ。履歴やステージへ追加する作業は必要ない。
今回は新しい練習用フォルダーに架空のテキストを作り、差分と終了コードを読む。必要なのはGitとBash。実際の設定ファイルや秘密情報は使わず、既存フォルダーへ上書きしない場所で試そう。
練習用のファイルを二つ作る
まずgit --versionでGitが使えるか確認する。以下はBashでの例だよ。空の練習フォルダーを新しく作り、その中で実行する。
printf 'color=blue\nsize=small\n' > before.txt
printf 'color=blue\nsize=large\n' > after.txt
printfは指定した文字を出力し、>はファイルへ保存する指定。同名ファイルがあれば上書きするので、練習用に空けた場所であることを先に確かめよう。
--no-indexで比較し、すぐ終了コードを読む
git --no-pager diff --no-index -- before.txt after.txt
printf 'exit=%s\n' "$?"
比較する順番は、変更前、変更後。--は、ここから後ろをファイルのパスとして扱う区切り。--no-pagerは、今回の短い結果を別の閲覧画面へ送らず、そのまま表示する指定だよ。
この例では、差分の中に次の行が出る。
-size=small
+size=large
先頭のマイナスは変更前にある行、プラスは変更後にある行。実際の表示にはファイル名や@@で始まる位置の情報なども付く。行の色だけで判断せず、記号と前後の内容を確認しよう。
この比較はファイルを書き換えない。after.txtへ変更案を書いたことと、差分を表示したことは別の操作だよ。
終了コード1は、今回は「違いがある」
| 状態 | 今回の比較で確認すること |
|---|---|
| 同じ内容の二つのファイル | 差分なし、終了コード0 |
| 内容が異なる二つのファイル | 差分あり、終了コード1 |
| 存在しないファイルなど | エラーの本文も確認し、通常の差分として処理しない |
--no-indexの比較には、差分の有無を終了コードへ反映する動作が含まれる。したがって、非ゼロならすべて「比較できなかった」と決めつけると、意味を読み違える。
ただし、終了コードだけを見て、エラーメッセージやファイルの存在確認を省くのも避けたい。すぐ次のprintfで読むのは、別のコマンドを実行すると$?がその結果へ変わるためだよ。
同じ内容ならどうなる?
新しいファイルを増やさずに確かめるなら、同じbefore.txtを左右に指定できる。
git --no-pager diff --no-index -- before.txt before.txt
printf 'exit=%s\n' "$?"
期待する結果は差分の表示なし、exit=0。最初の比較ではexit=1だったことと比べてみよう。編集部ではGitの一時フォルダーで、この二つの結果と、元ファイルが変わらないことを確認した。
自動化でset -eを使っている場合、差分があるだけで後続処理へ進まなくなる場合がある。比較結果0・1と実行エラーを区別して扱う必要があるので、確認なしに「失敗をすべて無視する」処理を足さないようにしよう。
いつものgit diffとの使い分け
Git管理中の作業場所で、作業中・ステージ・コミットの差を見たいならgit diffの基本へ。今回の方法は、指定した二つのパスの内容を比べる使い方だよ。
二つのファイルが完全に同じバイト列かを照合したいだけならSHA-256でのコピー確認も選択肢になる。文章のどこが違うかを読むことと、同一性を照合することを目的から分けよう。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。