Gitを使った分散開発管理4 – コミット

2011.07.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コミット

前回まででコミットの準備が完了したので、コミットを行ってみましょう。
コミットという行為は、自分にリポジトリに変更履歴を登録する事です。しかし、コミットしただけではセントラルリポジトリ (どこかからリポジトリを持ってきた場合)に変更を送るわけではありません。
別リポジトリに変更を送る方法は、別途解説します。
コミットはgit commitを使用して行います。 -mオプションに続けてメッセージを指定すれば、そのままコミットが実行されます。
git commitだけ入力した場合、エディタが起動してコミットメッセージ入力を促されます。
大量のコミットメッセージを入力する必要がある場合は、-mオプションなしでコミットを実行してください。
また、コミットを行う際、-vオプションを指定すると、コミット時の差分をエディタ上に表示することができます。

$ git commit -m "first commit"
[master (root-commit) acfaa92] first commit
 1 files changed, 10 insertions(+), 0 deletions(-)
 create mode 100644 hello.html

これで最初のコミットが実行されました。実施したコミットの内容を確認してみましょう。
コミットログを閲覧するには、git logを使用します。

$ git log
commit acfaa929f0746d94da32f07c148b359b7255a135 
Author: syuta <nakamura.shuta@gmail.com>
Date:   Tue Jul 12 16:47:51 2011 +0900

    first commit

上から、コミットを表すSHA-1ハッシュ値、コミットした人<連絡先>、日付、コミットメッセージが表示されています。
CVSやSubversionではコミットをリビジョンで管理していましたが、Gitではハッシュ値で管理します。
このコミットのハッシュ値の先頭7文字が、コミット時に出力されたものと同じになっています。(上の例ではacfaa92) ハッシュ値は全部で40文字ですが、短く表示するときは大抵は7文字でユニークになるためにこの表示になります。
なお、コミットの完全な差分を表示したい場合は-pオプションを使用すると、行レベルでどこがどう変わったのかを表示できます。

他にもコミットする方法があります。試しに、hello.htmlを修正して保存し、git commitを実行してみてください。
すると、addを実行するようメッセージが出たと思います。
ワーキングツリーを変更した場合、addを実行してステージングエリアに登録しないとコミット対象になりません。
これのaddとcommitを一度に行うには、-aオプションを使用します。

$ git commit -a -m "second commit"
[master d60a0cf] second commit
 1 files changed, 1 insertions(+), 1 deletions(-)

これで2度目のコミットが実施されました。
なお、この-aオプションは新規作成されたファイルは対象になっていないので注意してください。

コミットを取り消したい場合

コミットを完了した後で、新たなバグが発見された場合や想定外の問題が起きた場合など、コミットを取り消す必要があります。
こういった場合、git revertコマンドを使用します。このコマンドはコミットを消去せずに新らしいコミットを付け足すことで指定のコミットをなかったものとします。
コミットされた履歴が消去されるわけではないので、以前のコミットを取り消す理由を記述して新たなコミットを行います。
(コミットした行為自体を履歴から消すためには、git resetコマンドを使用します)

さきほど行った2度目のコミットを取り消してみましょう。

$ git revert -n HEAD

-nオプションを使用すると、すぐコミットしません。複数回のコミットを取り消す際に使用します。
HEADというのは、現在の作業場所から一番近いコミットを指しています。
今回の例では、d60a0cfのことです。コミットを取り消したので、あらためてコミットし直しましょう。

$ git commit -m "revert d60a0cf"
[master ed9b584] revert d60a0cf
 1 files changed, 1 insertions(+), 1 deletions(-)

git logで履歴を確認します。

$ git log
commit ed9b58408b9573a847921774f7c9dd1a98671b49
Author: syuta <nakamura.shuta@gmail.com>
Date:   Tue Jul 12 23:54:27 2011 +0900

    revert d60a0cf

commit d60a0cf23cc50d9023b3ab8e4c7058b95279a141
Author: syuta <nakamura.shuta@gmail.com>
Date:   Tue Jul 12 17:26:36 2011 +0900

    second commit

commit acfaa929f0746d94da32f07c148b359b7255a135
Author: syuta <nakamura.shuta@gmail.com>
Date:   Tue Jul 12 16:47:51 2011 +0900

    first commit

gig logで履歴をみると、コミットを取消したことがわかると思います。

今回はコミットの実行とその取消について解説しました。
次回はrevertとresetについてもう少し詳細な解説をします。