作業ツリーと任意のコミットの差分を確認する / Git

 「git diff」で引数にコミットを指定することで作業ツリーと任意のコミットとの差分を確認することができます。

作業ツリーと最新のコミットの差分を確認する

 最新のコミットはHEADというキーワードで表現することができます。「git diff」の引数にHEADを指定すると作業ツリーと最新のコミットの差分を確認することができます。

git diff HEAD
+------------------+
|                  |
|ローカルリポジトリ|
|の最新のコミット  | <------+
|                  |        |
+------------------+        |
         |                  |
+------------------+        |
|                  |        |
|インデックス      |        |---「git diff HEAD」はインデックスと
|                  |        |    リポジトリの最新のコミットの差分を表示します。
+------------------+        |
         |                  |
+------------------+        |
|                  |        |
|作業ツリー        | <------+
|                  |
+------------------+

作業ツリーとひとつ前のコミットの差分を確認する

 「git diff」の引数には任意のコミットを渡すことができます。一つ前のコミットは「HEAD^」で表現することができます。次のようにすれば作業ツリーとひとつ前のコミットの差分を確認することができます。

git diff HEAD^
+--------------------+
|+------------------+|
||ローカルリポジトリ||      
||の一つ前のコミット|| <----+
|+------------------+|      |
|        |           |      |
|+------------------+|      |
||ローカルリポジトリ||      |
||の最新のコミット  ||      |
|+------------------+|      |
+--------------------+      |---「git diff HEAD^」は作業ツリーと
         |                  |    リポジトリの一つ前のコミットの
+--------------------+      |    差分を表示します。
|                    |      |
|インデックス        |      |
|                    |      |
+--------------------+      |
         |                  |
+--------------------+      |
|                    |      |
|作業ツリー          | <----+
|                    |
+--------------------+

 また「^の数を増やすとさらにその前のコミットとの差分を表示することもできます。

git diff HEAD^^

 また「~」を使用すると前のコミットを数値で指定することもできます。次の指定は上記の指定と同じことを意味します。

git diff HEAD~2

 このようなコミットの指定はdiffコマンドだけではなく、その他のコマンドでも利用するので覚えて起きましょう。

任意のコミットと作業ツリーを比較する

 Gitではそれぞれのコミットはオブジェクト名と呼ばれる40桁の16進数で表現されます。コミットをオブジェクト名で指定することもできます。

 では、オブジェクト名を取得するために、現在のまでのコミットの一連の流れを「git log」コマンドで表示してみます。

 最初のコミットから現在のコミットまでの一連の流れが表示されます。commit という行にある40桁の数値がオブジェクト名です。

commit 2e5a5c06f37742129ef25b0ffa801d96cfd5a56d
Author: yuki-kimoto <kimoto.yuki@gmail.com>
Date:   Thu Jul 16 15:57:30 2009 +0900

    add : pass self to constraint functions

commit 4792262a6d81cd2283cb204c1739bffe662790a2
Author: yuki-kimoto <kimoto.yuki@gmail.com>
Date:   Thu Jul 16 08:45:10 2009 +0900

      bag fix : validator args is passed as empty array ref when args don't exists
.
.
.

commit fedaa0658da113c1616e5293484c68cb62588e51
Author: yuki-kimoto <kimoto.yuki@gmail.com>
Date:   Mon May 25 23:49:01 2009 +0900

    first commit

 このオブジェクト名を「git diff」の引数に指定することで作業ツリーと任意のコミットの差分を表示することができます。

git diff オブジェクト名

作業ツリーと他のブランチの差分を確認する

 Gitではブランチと呼ばれる機能を使って開発の主系と傍系を分岐させることができます。最初は「master」と呼ばれるブランチにいます。branchコマンドを使用するとブランチを作成することができます。

 今はブランチが存在するものとして話を進めます。ブランチを表示するには、

git branch

とします。現在のブランチがmasterで、傍系で開発しているbranch1があったとします。

----+----------master
    |
    +----------branch1

 このときmaster(現在のブランチ)の作業ツリーとbranch1との差分を確認するには次のようにします。

git diff branch1

 またGitではローカルのリポジトリにあるブランチだけでなく、リモートのリポジトリに存在するブランチ(通常は他の人のもの)との比較を行うこともできます。これらはリモート追跡ブランチと呼ばれ

git branch -r

で表示することができます。以下のように表示されます。

kraih/master
origin/HEAD
origin/master
origin/trial1

 現在の作業ツリーとリモート追跡ブランチの差分を確認するには以下のようにします。

git diff kraih/master

タグ名を使用してコミットを指定する

 Gitではコミットに対してタグと呼ばれる機能を使用して名前をつけておくことができます。このタグ名を使ってタグが表すコミットと現在の作業ツリーの内容を比較することができます。

git diff タグ名

コミットの指定はdiffコマンドで練習する

 ここで解説したコミットの指定方法は他のコマンドでも使用することになりますので、リポジトリに更新をかけたりしない安全なdiffコマンドで練習するとよいと思います。

関連情報