Gitコマンドの一つ、git diff は変更されたファイルの差分を表示するコマンドです。実際の開発現場において動作テストがうまくいかなかった時など、変更前と後のファイルの差分を確認して変更点や問題を引き起こしている点を探すことができます。
目次
git diff とは
Gitはリポジトリと呼ばれる保存場所に変更履歴を記録していくバージョン管理システムです。
記録した変更履歴は他の開発者が確認したり、動作テストがうまくいかなかった場合に問題点を探すために使用できます。
git diff は基本的に自分のワーキングツリーを調べるコマンドで、『比較元』と『作業ツリー』を比べた差分を表示します。
git diff の使い方
実際に git diff コマンドを使ってみましょう。
今回はtestリポジトリに下記の sample.html というファイルを用意しました。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>デモサイト</title> </head> <body> <p>これはサンプルなのです!</p> </body> </html>
ターミナル(Git Bash)で下記のコマンドを実行してみます。
git diff
この時点ではファイルが変更されていないため何も表示されません。
次にこのファイルを下記のように変更し保存します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>デモサイト</title> </head> <body> <p>これはサンプルなのです!</p> <p>だからどうだというのです!</p> </body> </html>
もう一度 git diff コマンドを実行してみましょう。
「だからどうだというのです!」という一行が追加されたことが確認できます。
行末に ^M が表示される場合
この場合は改行コードが CRLF になっていることが原因です。
Git には空白文字の扱いを決める core.whitespace という設定があり、そこで blank-at-eol が有効になっていると git diff した際に改行コードの前にある空白文字をエラーとして報告してくれます。
解決方法としては改行コードをすべて LF にするか、core.whitespace に cr-at-eol を有効にして CR を改行コードの一部として認識させる方法があります。
git diff で使用可能なオプション
git diff コマンドにつけられるオプションには下記のようなものがあります。
git diff コマンドでは比較対象を指定しない場合、インデックスとワーキングツリーの差分を表示します。
差分が生じたファイル名だけを表示する
git diff --name-only
比較対象はインデックスとなります。
ステージングエリアに上げたファイルを比較する
git diff --cached HEAD
比較対象は HEAD となります。
スペースの差分を無視する
git diff -w git diff --ignore-all-space
スペース(whitespace)だけの違いを変更とみなさず無視するオプションです。
文字レベルで違いを表示する
git diff --word-diff git diff --word-diff=color git diff --color-words
git diff コマンドは通常は行の差分を表示しますが、「–word-diff」オプションを付けると文字レベルで違いを表示してくれます。
比較するファイルを限定する
git diff -- <パス>
コマンドの後にパスを付けることによって比較ファイルを限定することができます。
例えば差分の表示をindex.phpだけに限定する場合は下記のように記述します。
git diff -- index.php
比較するgitオブジェクトを限定する
git diff <コミット>:<パス> <コミット>:<パス>