2009年8月23日日曜日

ステージを理解して git をもっと便利に使う(その2)

前回から引き続き、「ステージを理解して git をもっと便利に使う」というテーマでコマンドを紹介します。
今回は git diff --cached です。

●git diff --cached
使用例

git diff --cached


前回覚えた git add でstageする/しないを使い分けると、困ったことがひとつ出てきます。
それは git diff が「index」と「ワーキングコピー」の差分だけを表示すること、つまり一旦git addでstageした内容はgit diffで表示されなくなってしまうことです。
前回の復習として、git add直後の「最新のコミット」と「index」、「ワーキングコピー」の関係を思い出してみましょう。
「最新のコミット」≠「index」=「ワーキングコピー」

git diffは「index」と「ワーキングコピー」の差分だけを表示するので、「最新のコミット」と「index」の差分や「最新のコミット」と「ワーキングコピー」の差分は表示できません。
もちろんgit add -uで「ワーキングコピー」の変更点をすべてstageすると、git diffは何も表示しなくなります。
ここで git diff --cached を使えば「最新のコミット」と「index」の差分(これは次回のコミットに含まれる変更点でもあります)を表示できます。

それでは具体的な例を見ていきましょう。
前回使った src/abc.c と README のシチュエーションを考えます。
git addする前であれば「index」は「最新のコミット」と同一なので、以下のようにgit diffはcheckoutしてから編集した内容すべてを示してくれますが・・・

kt@ume% git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#
#       modified:   README
#       modified:   src/abc.c
#
no changes added to commit (use "git add" and/or "git commit -a")
kt@ume% git diff
diff --git a/README b/README
index f6419fa..59fbc52 100644
--- a/README
+++ b/README
@@ -9,4 +9,4 @@ This is test project.
% make
% make install

-3. Have fan.
+3. Have fun.
diff --git a/src/abc.c b/src/abc.c
index 869a851..31c175f 100644
--- a/src/abc.c
+++ b/src/abc.c
@@ -10,7 +10,7 @@ int main(int argc, char **argv)

while ((ch = getopt(argc, argv, "v")) != -1) {
switch (ch) {
-               case 'V':
+               case 'v':
printf("%s %s\n", "hello", "0.1");
return 0;
break;

以下の用にgit addでstageすると、その変更内容はgit diffでは表示されなくなります。
kt@ume% git add src/abc.c
kt@ume% git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       modified:   src/abc.c
#
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#
#       modified:   README
#
kt@ume% git diff
diff --git a/README b/README
index f6419fa..59fbc52 100644
--- a/README
+++ b/README
@@ -9,4 +9,4 @@ This is test project.
% make
% make install

-3. Have fan.
+3. Have fun.

ここでgit diff --cachedを実行することで、「index(stageされた変更内容)」と「最新のコミット」との差分、つまり次回のコミットに含まれる変更内容を表示することができます。
kt@ume% git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       modified:   src/abc.c
#
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#
#       modified:   README
#
kt@ume% git diff --cached
diff --git a/src/abc.c b/src/abc.c
index 869a851..31c175f 100644
--- a/src/abc.c
+++ b/src/abc.c
@@ -10,7 +10,7 @@ int main(int argc, char **argv)

while ((ch = getopt(argc, argv, "v")) != -1) {
switch (ch) {
-               case 'V':
+               case 'v':
printf("%s %s\n", "hello", "0.1");
return 0;
break;

いかがですか?
git diff --cachedを使うことで次回のコミットに含まれる内容を簡単に確認できるようになりました。
今まで使っていたgit diffと合わせて使えばstage管理は簡単です。

次回は間違えてaddしてしまった内容を取り消すgit resetを紹介します(ヒントはgit statusの出力にあります)。

つづく!

0 件のコメント:

コメントを投稿