コミットとは?ファイルの変更を履歴に記録する仕組み

Gitの版:2.56.0
ファイルを保存しただけでは、Gitの履歴には何も残りません。変更を「この時点の版」として履歴に記録する操作がコミットです。
本記事では、Gitの公式ドキュメントと『Pro Git』をもとに、コミットまでの流れと、コミットに何が記録されるのかを解説しましょう。
コミットとは
コミットは、リポジトリの中のファイルの状態を、1つの版として履歴に記録する操作です。記録した1回分の版も同じくコミットと呼び、コミットを重ねた分だけ、ファイルの移り変わりが履歴に残ります。
いつでも過去のコミットの状態を見たり、比べたり、戻したりできるのは、この履歴があるからです。
『Pro Git』によると、Gitはコミットのたびに、変更の差分ではなく、その時点のファイル全体の記録(スナップショット)を残します。ただし、変わっていないファイルは前の版の同じファイルを指すだけにして、容量を抑えているのです。
コミットまでの3つの場所
Gitでは、ファイルを変更してからコミットするまでに、3つの場所を通ります。
1つ目は、ふだんファイルを編集する作業フォルダーです。ここでファイルを書き換えると、そのファイルは「変更した」状態になります。
2つ目のステージ(staging area)は、次のコミットに含めたい変更を git add で載せておく場所で、技術的な呼び名はインデックス(index)です。
3つ目のリポジトリの履歴には、git commit を実行したとき、ステージに載っている内容だけが新しいコミットとして記録されます。
ステージという中間の場所があるおかげで、複数のファイルを変更していても、関係するものだけを選んで1つのコミットにまとめられるのが利点です。「見出しの修正」と「画像の追加」を同時に進めていても、別々のコミットに分けて記録できます。
コミットに記録される情報
1つのコミットには、ファイルの記録のほかに、いくつかの情報が付いています。
『Pro Git』によると、コミットが持つのは、ファイル全体の記録への参照、作者の名前とメールアドレス、コミットの説明(メッセージ)、1つ前のコミットへの参照です。最初のコミットには前がなく、ブランチを合わせたコミットには前が2つ以上あります。
各コミットを区別するのは、ハッシュと呼ばれる40文字の英数字です。ハッシュは中身から計算されるため、記録が少しでも変わればハッシュも変わってしまいます。Gitが履歴の改ざんや破損に気づけるのは、このためです。ふだんの画面では、頭の7文字ほどに省略して表示されます。
よいコミットの単位とメッセージ
コミットは、あとから自分やほかの人が履歴を読むための記録でもあります。
1つのコミットに1つの目的の変更だけを入れておけば、あとから読みやすいでしょう。「見出しを直す」と「画像を足す」を1つにまとめると、片方だけを取り消したいときに困るからです。
メッセージには、何をなぜ変えたのかを短く書きましょう。「修正」だけでは、あとで履歴を見ても中身が分かりません。
また、コミットのメッセージと作者の情報は、リモートへプッシュするとほかの人にも見えます。作者のメールアドレスを公開したくない場合は、サービスが用意している非公開用のアドレスを使ってください。
製品での使われ方
コミットはGitそのものの機能なので、どのサービスやエディターでも同じ考え方で使えます。GitHubやGitLabのWebの画面では、コミットの一覧や、コミットごとの変更点を確かめることが可能です。
GitHubで、コミットに載るメールアドレスを非公開にする手順は、本サイトの「【GitHub】メールアドレスを非公開にする方法」で案内しました。
プログラミング用のAIエージェントに、コミットまで任せることもできます。その場合も、何を1つのコミットにまとめたのか、メッセージが内容と合っているのかを確かめてからプッシュしてください。