Git の基本 | git commit
git commit コマンド
git commit は、ステージングされたスナップショットをローカルリポジトリにコミットするためのコマンドである。コミットされたスナップショットは、プロジェクトの安全に保存されたバージョンとして理解でき、明示的に変更を指示しない限り Git がそれを変更することはない。git add と並んで、これは Git の最も重要なコマンドの 1 つである。
名前は同じだが、このコマンドは svn commit とはまったく異なる。スナップショットはローカルリポジトリにコミットされるため、他の Git リポジトリには一切影響しない。
使い方
git commit
ステージングされたスナップショットをコミットする。このコマンドを実行するとテキストエディタが起動し、コミットメッセージの入力を求められる。メッセージを入力した後、ファイルを保存してエディタを終了するとコミットが実行される。
git commit -m "<message>"
テキストエディタを起動せず、<message> をコミットメッセージとしてステージングされたスナップショットをコミットする。
git commit -a
作業ディレクトリ内のすべての変更のスナップショットをコミットする。ただし、対象になるのは追跡済みファイル、つまり過去に git add でステージングエリアへ追加されたことがあるファイルの変更だけである。
補足説明
スナップショットは常にローカルリポジトリにコミットされる。これは、作業コピーを中央リポジトリにコミットする SVN との基本的な違いである。Git は、必要になる前に中央リポジトリとの通信を強制しない。ステージングエリアが作業ディレクトリとローカルリポジトリの間のバッファとして機能するように、各開発者のローカルリポジトリは作業成果と中央リポジトリの間のバッファとして機能する。
これは Git ユーザーの開発モデルに大きな変化をもたらす。Git を使う開発者は、変更を中央リポジトリに直接コミットするのではなく、ローカルリポジトリにコミットを蓄積できる。SVN 型の協業と比較すると、作業を小さな単位に分割できること、関連性の強いコミットをまとめたまま維持できること、中央リポジトリへ公開する前にローカルリポジトリを整理できることなど、多くの利点がある。そのため開発者は独立した環境で作業でき、作業が適切な区切りに到達するまで他の人との統合を遅らせることができる。
差分ではなくスナップショットを保存する
SVN と Git の間には実用上の違いがあるが、それだけでなく、基本構造はまったく異なる設計思想に基づいている。SVN がファイルの差分を追跡するのに対し、Git のバージョン管理モデルはスナップショットに基づいている。たとえば SVN のコミットは、リポジトリにある元ファイルとの差分で構成される。一方 Git は、各コマンドごとにそれぞれのファイルの全内容を記録する。
Git チュートリアル: 差分ではなくスナップショットを保存する
この方式では、特定バージョンのファイルを再現するときに変更データから組み立てる必要がない。各ファイルのすべてのバージョンを Git の内部データベースからすぐに取得できるため、Git のほとんどの操作は SVN と比べて非常に高速に動作する。
Git で使われるスナップショットモデルは、ブランチやマージのツールから協業ワークフローまで、バージョン管理モデルのあらゆる側面に広範な影響を与えている。
使用例
次の例では、hello.py という名前のファイルを編集し、それをローカルリポジトリにコミットする準備ができているとする。まず git add でファイルをステージングし、次にステージングされたスナップショットをコミットする。
git add hello.py
git commit
このコマンドを実行すると、git config で指定できるテキストエディタが起動し、コミットされる内容の一覧を表示するとともに、コミットメッセージの入力を求める。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: hello.py
#
Git はコミットメッセージの形式を強制しないが、標準的な形式では、1 行目にコミット全体の説明を 50 文字以内で書き、2 行目を空行にし、3 行目以降で変更内容を詳しく説明する。次はその例である。
Change the message displayed by hello.py
- Update the sayHello() function to output the user's name
- Change the sayGoodbye() function to a friendlier message
また、多くの開発者はコミットメッセージを現在形で書く傾向がある。これは履歴をリポジトリに対する一連の操作として読めるようにし、履歴を書き換える作業をより直感的に理解できるようにする効果がある。