git add/commit/diff の動作2009年02月12日 17時58分37秒

以前にも git のインターフェースは他と同じ名前なのに動作が違うのは指摘した。似て非なる物の為、更にとっつきが悪い。git heckout もその一例だ。

git の add と commit の動作も他とは全く異なる。

非 git での add は、新しいディレクトリやファイルを追加するのに使われる。非 git での commit は引数に指定されたファイルをコミットするのに使われる。そして、diff はこの手元での変更を表示する。様々なオプションを指定すればタグなどとの比較も可能だが、ここで言いたいのは何もオプションを与えないときの動作のことだ。

git では、全てのコミットを事前に add する必要がある。git の add はディレクトリやファイルを追加するのではなく、変更をコミットする為の予約をするコマンドだ。そして、commit であらかじめ登録しておいた変更のうち、引数で渡されたファイルのみの差分をコミットする。commit には add が必須だ。そして、diff コマンドは、手元の変更で add されていない物のみを表示する。そのため、git add が終わった変更は、git diff にて表示されない。

hg で例をあげる。


% hg init
% echo A > file.txt
% hg add file.txt 
% hg commit -m 'Create file.txt.'
% echo B >> file.txt 
% hg diff
diff -r d3e5d96de93f file.txt
--- a/file.txt  Fri Feb 11 23:10:27 2009 -0500
+++ b/file.txt  Fri Feb 11 23:11:42 2009 -0500
@@ -1,1 +1,2 @@
 A
+B
% hg add file.txt 
file.txt already tracked!

二度目の file.txt の add は出来ないと言われる。

今度は git で試す。


% git init
Initialized empty Git repository in /tmp/git/.git/
% echo A > file.txt
% git add file.txt 
% git commit -m 'Create file.txt'
Created initial commit 58d0fcc: Create file.txt
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file.txt
% echo >> B file.txt 
% git diff
diff --git a/file.txt b/file.txt
index f70f10e..35d242b 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@
 A
+B

ここでは、diff が表示される。

% git commit -m 'Added B.'
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#
#       modified:   file.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

しかし、これはコミットできない。

% git add file.txt 
% git diff
% git commit -m 'Added B.'
Created commit 9f0a6ac: Added B.
 1 files changed, 1 insertions(+), 0 deletions(-)

add を使い登録することで、コミットが受け付けられた。そして、diff では変更を見られなくなっている。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2009/02/12/4114811/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。