コミットループ


weather-appで過去20分間作業してきたとしましょう。src/index.jsの実際のバグを修正しました。気温変換がずれていたのです。その過程でstyles.cssのリスタイリングも始めましたが、その変更は途中で完成していないため、他の誰かに見せる準備ができていません。バグ修正をそれ自体のチェックポイントとして今すぐ保存したいのです。未完成のスタイリングを一緒に引きずることなく。
それがコミットループの目的です。まだリポジトリをセットアップしていない場合は、Your first repositoryでgit initとクローンについて説明しています。ここからは、このチャプターが1つ開いていることを前提としています。
3つのステップ:ワーキングディレクトリ、ステージングエリア、コミット
Gitで行うすべての変更は、永続的な履歴になるまでに3つのステップを通過します。ワーキングディレクトリは、プロジェクトが現在ディスク上に存在する状態です。あなたが積極的に編集しているファイルです。**ステージングエリア**は、次に保存したい変更を正確に配置する保管場所です。コミットは、それを書いたら、メッセージを説明するとともに、保存されたスナップショット自体です。
引っ越しのための荷造りを想像してください。あなたの家全体がワーキングディレクトリです。あなたが所有しているすべてのもの、どんな状態でも。玄関に梱包されてテープで封じられた箱がステージングエリアです。持っていくために意図的に選んだものだけです。それらの箱を乗せて走り去るトラックがコミットです。その瞬間に何が出発したか、そして中に何が入っているかを説明するラベルが付いた記録です。
実際のターミナルでそのメンタルモデルが表示されます。weather-appで両方のファイルを編集した後、git statusは何も変更せずに現在の状態を読み取ります:
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: src/index.js
modified: styles.css
no changes added to commit (use "git add" to commit)両方のファイルが「not staged」として表示されるのは、ファイルを編集すると、ワーキングディレクトリだけが変更されるためです。git addでGitに配置するように指示するまで、何もステージングエリアに移動しません。これが次のセクションです。
ここが、ステージングエリアが存在する理由の全体像が明確になる場所です。ステージングエリアを使用すると、ワーキングディレクトリにまだ編集されているその他のものから独立して、コミットにどの内容を含めるかを正確に選択できます。これなしに、チェックポイントを保存すると、準備ができているかどうかに関わらず、ディスク上のすべての変更を一度に取得することになります。
それを使えば、src/index.jsの完成したバグ修正をステージングし、途中のstyles.cssを除外して、実際に完成した部分だけをコミットできます。ステージングとワーキングディレクトリが同時に異なる内容を保持できるというこの1つの詳細は、最初の週にほぼすべての人を混乱させます。一度理解できれば、Gitの日々のワークフローの残りの部分がより理にかなってきます。
git addで何を含めるかを選択でき、それがあなたが半分完成した変更を除外しながら1つの完成した変更を保存できる理由です。 変更のステージング:git add
git addは、ワーキングディレクトリからステージングエリアに変更を移動します。次のコミットにどのファイルの変更を含めるかをポイントします:
$ git add src/index.js
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/index.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: styles.csssrc/index.jsが「Changes to be committed」に移動し、バグ修正がステージングされて準備ができました。styles.cssは「not staged」の下にリストされたままで、これはリスタイリングが未完成の間のあなたが望む場所です。git add styles.cssも実行すると、それもステージングされます。git add .を実行すると、現在のフォルダ内のすべての変更されたファイルを一度にステージングします。これはディスク上のすべてが実際に準備ができているのを確認したら便利です。
git add <file>はそのファイルの現在の変更をステージングエリアに移動し、次のコミット準備をします。まだ追加していないファイルは除外されるため、1つのものを終了して別のものを編集中のまま残すことができます。git add .はすべての変更されたファイルを一度にステージングし、すべてが実際に準備ができたら便利です。 スナップショットの保存:git commit
ステージングエリアがあなたが望むものを保持したら、git commitはそれを永続的なスナップショットとして保存し、-mフラグ(「message」の短形)は、それと一緒に移動する説明を提供します:
$ git commit -m "Fix temperature conversion in Celsius-to-Fahrenheit formula"
[main 4f2a1c9] Fix temperature conversion in Celsius-to-Fahrenheit formula
1 file changed, 1 insertion(+), 1 deletion(-)src/index.jsだけが含まれました。それがステージングしたすべてだからです。styles.cssはまだワーキングディレクトリで編集されたままで、リスタイルが完成したときはいつでも待機しています。短いid、4f2a1c9は、このコミットの名前を付け、Historyチャプターはこのようなプロジェクトの完全なコミットリストを読むことをカバーしています。
git commit -m "message"は現在ステージングされているものを永続的なスナップショットとして保存し、あなたが与えたメッセージで保存します。ステージングしなかったものはそのままで編集可能のままです。メッセージを短く保ち、コミットが行うことについて明確にしてください。あなたがそれを予想するより頻繁に将来のあなたがそれを読み直すでしょう。 
