新しいコミットを作成するには3つのステップが必要です:
実際には、ステップ1と2を相互に好きなだけ繰り返すことができます: ステップ3でコミットしたいものの追跡を保つ為、git は "索引(index)" と呼ばれる 特別なエリア内にツリーの中身のスナップショットを保管しています。
最初は索引の中身は HEAD の中身と同じです。 コマンド "git diff —cached" は HEAD と索引間の差分を表示する為、 この時点では何も出力しません。
索引を変更するのは容易です:
索引を新しく修正したファイルの中身で更新するには、以下のようにします。
$ git add path/to/file
新しいファイルの中身を索引に追加するにも、以下のようにします。
$ git add path/to/file
索引と作業ツリー上からファイルを削除するには、
$ git rm path/to/file
各ステップを行った後には、
$ git diff --cached
を行うことで HEAD と索引ファイル間の差分を確認することができます。— これはコミットした時に作成される内容です。— そして
$ git diff
は、作業ツリーと索引ファイル間の差分を表示します。
"git add" は常に現在のファイルの中身を索引に追加することに注意
してください;さらに同じファイルに変更を加えても再度 git add
をそのファイルに
行わない限りは無視されます。
準備ができたら、
$ git commit
を実行します。git はコミットのメッセージの入力を促してから 新しいコミットを作成します。意図した結果になっているかを確認するには、以下のようにします。
$ git show
特別なショートカットとして
$ git commit -a
というのがあります。これは変更又は削除した全てのファイルの索引を更新し コミットを作成する操作を、1回のステップで全て行います。
たくさんのコマンドがコミットしようとしているものの追跡を保つ為に 役に立ちます:
$ git diff --cached # HEAD と索引間の差分;
# つまり、"commit" を実行したときにコミットされる内容
$ git diff # 索引と作業ディレクトリ間の差分;
# つまり、"commit" を実行したときに含まれない
# 変更内容
$ git diff HEAD # HEAD と作業ツリー間の差分:
# つまり、"commit -a" を実行したときにコミットされる内容
$ git status # 上記のサマリをファイル毎に簡潔に表示
これらのことをするために git-gui(1) を使用することもできます。 git-gui は コミットの作成や、索引と作業ツリー間の差分の参照、 索引に含めるべき差分ハンクを個々に選択する(差分ハンクを右クリックして、 "Stage Hunk For Commit" を選択する) ことができます。