git diff HEAD^ と git diff HEAD^..HEAD との違い

試した環境

本題

git diff HEAD^git diff HEAD^..HEADでは未コミットの変更箇所があるときに挙動が違います。 以下のような内容のテキストファイルを用意します。

1st
2nd commit
3rd unstage

1行目を書いてgit add -Aおよびgit commitし、2行目を追記してgit add -Aおよびgit commitし、3行目を書いて commit してない状態にします。 この時git diff HEAD^をすると、最後にコミットした変更点とコミットしていない変更点に変更箇所のマークがつきます。

$ git diff HEAD^
diff --git a/file.txt b/file.txt
index 2a5d015..6dac622 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,3 @@
 1st
+2nd commit
+3rd unstage

git diff HEAD^..HEADをすると、最後にコミットした変更点のみに変更箇所のマークがつきます。

$ git diff HEAD^..HEAD
diff --git a/file.txt b/file.txt
index 2a5d015..eb27d5c 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@
 1st
+2nd commit

上記は unstaged の結果ですが staged も同じ結果です。 file2.txt を追加してgit add file2.txtした状態でgit diff HEAD^をすると、以下のようにfile2.txtの変更点に追加で変更箇所のマークがつきます。

$ git diff HEAD^
diff --git a/file.txt b/file.txt
index 2a5d015..6dac622 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,3 @@
 1st
+2nd commit
+3rd unstage
diff --git a/file2.txt b/file2.txt
new file mode 100644
index 0000000..5c1789c
--- /dev/null
+++ b/file2.txt
@@ -0,0 +1 @@
+3rd staged

参考

Git - git-diff Documentation