git add の内部動作をステップで可視化します。
git add は、ファイルの変更を「次のコミットに含める準備をする」コマンドです。 Git ではファイルを保存しただけではコミットに含まれません。git add で明示的に「これをコミットに入れたい」と Git に伝える必要があります。
たとえるなら、買い物かごのようなものです。 お店(Working Directory)で商品(ファイル)を手に取っても、かご(ステージングエリア)に入れなければレジ(commit)では精算されません。git add は「かごに入れる」操作です。
このステージングエリアがあることで、変更したファイルの中から、コミットに含めたいものだけを選べるのが Git の大きな特徴です。 10個のファイルを変更しても、そのうち3つだけをコミットする、ということが簡単にできます。
git add でステージ → git commit で確定「かごに入れる」と言いましたが、裏側では何が起きているのでしょうか? もう少し具体的に覗いてみましょう。 Git は git add を実行すると、内部で3つの処理を行っています。
上のツールでステップを進めると、この3つの処理が順番に行われる様子を確認できます。
git add [ファイル]指定したファイルをステージする(blob 作成 + index 更新)git add .カレントディレクトリ以下の全変更をステージするgit add -p [ファイル]ファイル内の変更を hunk 単位で選択してステージする(部分ステージ)git add -A新規・変更・削除を含むすべての変更をステージするgit add -n [ファイル]実際にはステージせず、何が追加されるかをドライランで確認するgit reset [ファイル]ステージを取り消す(index のエントリを HEAD の状態に戻す。blob は残る)| git add | git commit | |
|---|---|---|
| 作るオブジェクト | blob | tree + commit |
| 更新するファイル | .git/index | .git/refs/heads/[ブランチ] |
| 役割 | スナップショットの準備 | スナップショットの確定 |
| 取り消し | git reset [ファイル] | git revert / git reset |
| 繰り返し | 何度でもやり直せる | 履歴に残る(amend 以外) |
git add を実行すると、Git はまず .gitignore のルールをチェックします。 マッチするファイルは「未追跡」のままステージされないようになります。
ただし、すでに追跡済み(index に存在する)ファイルは .gitignore の対象外です。 追跡を止めるには git rm --cached で index から削除する必要があります。