DESIGN / CODE / INFRA / AI

解説

Git管理していない二つのファイルを比較する:diff --no-indexと終了コードの読み方

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

Git管理していない二つのファイルを比較する:diff --no-indexと終了コードの読み方
保存リストを見る →
この記事の道しるべ 5項目

変更前の設定の控えと、変更案のファイルを比べたい。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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。