Gitの3エリア — add と commit は別々の引っ越し
git add と git commit の違いが曖昧なまま使っている――そんな人は多いはず。Gitを理解する鍵は、ファイルが置かれる3つのエリアを分けて見ることです。手元で編集するWorking Directory(作業ツリー)、コミット予定を並べるStaging Area(ステージ)、履歴を確定保存するRepository(リポジトリ)。
Gitの操作は、要するにこのエリア間でファイルを移すことです。下の図1で 編集 → git add → git commit を押し、ファイルが左から右へ進む様子と、ステータスがどう変わるかを見てください。
add と commit は、別々の引っ越し
多くの人がつまずくのが、「変更を保存する」操作が2段階に分かれている点です。git add は、作業ツリーの変更をStagingに登録するだけ。まだ履歴には残りません。git commit で、はじめてStagingの内容がRepositoryに確定保存されます。なぜ2段階かというと、「次のコミットに何を含めるか」を選べるようにするためです。複数の変更のうち、関係するものだけ add してコミットを意味のある単位に分けられます。
エリアを分けて考えると、ふだんのコマンドが「どこからどこへの移動か」で読めるようになります。git restore <file> はStaging(やRepositoryのHEAD)の内容で作業ツリーを上書きして編集を捨てる操作――図1の「破棄」ボタンがこれです。git diff は作業ツリーとStagingの差、git diff --staged はStagingとRepositoryの差を見ています。3つの箱と、その間の矢印さえ頭にあれば、Gitの操作はぐっと見通しよくなります。
- Working Directory
- 実際にファイルを編集している作業ツリー。エディタで触っているのはここ。
- Staging Area
- 次のコミットに含める変更を並べる場所(indexとも)。git add で登録する。
- Repository
- コミットとして履歴が確定保存される領域(.git)。git commit で書き込まれる。
- HEAD
- いま自分がいるコミットを指す印。restore や diff の基準として使われる。
まとめ
GitはWorking Directory / Staging / Repositoryの3エリアと、その間を移す操作でできています。編集は作業ツリーだけを変え、git addでStagingへ、git commitでRepositoryへ確定――この一方向の流れが基本です。add と commit が別なのは、コミットの中身を選べるようにするため。3つの箱のイメージを持てば、restore や diff といったコマンドも「どこを見て・どこへ動かすか」で理解できます。