Gitのdiffってなに?変更したところを見てみよう

こんにちは、さるまりんです。

ファイルを編集していると、

「どこを変えたんだっけ?」

となることがあります。

そんなとき、Gitを使っているなら便利なのが、

git diff

です。

diff は、英語の difference から来ていて、「違い」や「差」という意味があります。

その名前のとおり、git diff を使うと、ファイルの変更されたところを見ることができます。

今回は、git diff を使って、Gitで変更したところを見てみようと思います。

ファイルを変更してみる

例えば、Gitで管理している hello.txt というファイルがあるとします。

中には、

こんにちは
今日はいい天気です。

と書いてあります。

これを少し変更してみます。

こんにちは
今日はとてもいい天気です。

「とても」を追加しました。

Gitでは、

git status

を使うと、ファイルが変更されていることを確認できます。

modified:   hello.txt

ただ、これだけでは、hello.txt のどこを変更したのかまでは分かりません。

そこで登場するのが git diff です。

git diffを使ってみよう

次のコマンドを実行します。

git diff

すると、例えばこのような表示が出ます。

-今日はいい天気です。
+今日はとてもいい天気です。

実際の git diff では、この前後にもファイル名や行番号などの情報が表示されます。

まず注目したいのは、

-
+

の部分です。

- は、変更前の内容。

+ は、変更後の内容です。

つまり、

-今日はいい天気です。
+今日はとてもいい天気です。

は、

「今日はいい天気です。」

という行が、

「今日はとてもいい天気です。」

になったことを表しています。

これなら、どこを変更したのか分かりますね。

変更したところを確認する習慣をつけよう

ファイルを編集していると、

「ここだけ変えたつもりだったけど、ほかのところも変えていた」

ということもあります。

そんなとき、コミットする前に、

git diff

で変更したところを見ておくと便利です。

例えば、

git status

で、

どのファイルが変わったのか

を確認して、

git diff

で、

そのファイルのどこが変わったのか

を確認する。

この2つを一緒に使うと、Gitで今どんな変更をしているのかが見えやすくなります。

以前、変えるつもりのない部分に全角のスペースを入れてしまって、プログラムが動かなかったことがありまして。

それ以降、自分が何を変えたかをちゃんと知っておくために、git diff で確認するようにしています。

git addしたあとにgit diffしてみる

では、変更した hello.txt をステージングしてみましょう。

git add hello.txt

そして、もう一度、

git diff

を実行します。

すると、何も表示されなくなりました。

「あれ?」

と思うかもしれません。

変更した内容は、まだコミットしていません。

それなのに、どうして git diff には表示されないのでしょうか。

git diffは何と何を比べている?

ここで、Gitの状態を少しだけ見てみます。

Gitでは、大まかに考えると、

作業しているファイル
        ↓
ステージングエリア
        ↓
コミット

という流れで変更を記録していきます。

通常の、

git diff

が見ているのは、

作業しているファイルとステージングエリアの違い

です。

git add をする前は、作業しているファイルには変更があります。

その変更は、まだステージングエリアには入っていません。

作業しているファイル
        ↓
   変更されている
        ↓
ステージングエリア

という違いがあります。

そのため、git diff に変更内容が表示されます。

一方、

git add hello.txt

をすると、その変更がステージングエリアに追加されます。

すると、作業しているファイルとステージングエリアの内容に違いがなくなるので、

git diff

には何も表示されなくなります。

変更が消えたわけではありません。

比べている場所に違いがなくなった

ということなんですね。

ステージングした変更を見るには?

では、git add した変更を見るにはどうしたらいいのでしょうか。

そんなときは、

git diff --staged

を使います。

git diff --staged は、

ステージングエリアと、最後にコミットした内容の違い

を見るコマンドです。

さっきの変更をステージングしたあとなら、

-今日はいい天気です。
+今日はとてもいい天気です。

という変更を確認できます。

つまり、

git diff

と、

git diff --staged

では、見ている場所が違うのです。

ざっくり整理すると、

最後のコミット
      ↓
git diff --staged
      ↓
ステージングエリア
      ↓
git diff
      ↓
作業しているファイル

という関係になります。

diffは「違いを見る」ものです

git diff を、

変更したところを表示するコマンド

と覚えても、もちろん使えます。

ただ、

2つの状態の違いを見るもの

と考えてみると、少し分かりやすくなるかもしれません。

git diff

なら、

作業しているファイルとステージングエリア。

git diff --staged

なら、

ステージングエリアと最後のコミット。

Gitには、ほかにもコミット同士やブランチ同士など、いろいろな状態を比べる方法があります。

どれも基本にあるのは、

「こことここは、何が違うんだろう?」

という考え方です。

この基本が分かってくると、ブランチ同士の差分を見たり、過去のコミットと今の状態を比べたりするときにも、少し理解しやすくなります。

まとめ

今回は、git diff を使って変更したところを見る方法について見てきました。

git diff

を使うと、まだステージングしていない変更を見ることができます。

そして、

git diff --staged

を使うと、ステージングした変更を見ることができます。

最初は、

git status

で変更されたファイルを確認して、

git diff

で変更されたところを見る。

まずは、この使い方から始めてみるとよいと思います。

コミットする前に、

「何を変えたんだっけ?」

と思ったら、

git diff

を一度試してみてください。

Gitが今見ている「違い」が、少し見えてくるかもしれません。

他の使い方も、また詳しく見ていきたいです。

読んでくださってありがとうございました。
それではまた!