TL;DR
ファイルの変更履歴を管理するバージョン管理システム。変更の差分ではなく、コミットのたびにファイル全体の状態をスナップショットとして記録する。
なぜ必要か
履歴はすべてローカルのデータベースにあるので、履歴の閲覧やコミットなど、ほとんどの操作をサーバに問い合わせずに行える。オフラインでも作業でき、ネットワークにつながったときにまとめて送ればよい。
仕組み
スナップショット
CVS や Subversion などは、ファイルごとに基準のバージョンからの差分を保存する。Git はコミットのたびに全ファイルのスナップショットを撮り、その参照を保存する。変更のないファイルは保存し直さず、前の同じファイルへのリンクを持つ。
完全性
Git はすべてのデータを保存する前にチェックサムを取る。チェックサムには SHA-1 ハッシュ(16 進数 40 文字)を使い、ファイル名ではなく内容のハッシュ値でデータを保存する。そのため、Git が気づかないうちにファイルの内容が変わったり、転送中にデータが壊れたりすることはない。
3 つの状態
ファイルは、コミット済み(ローカルのデータベースに保存された)、修正済み(変更したがコミットしていない)、ステージ済み(次のコミットに含める印を付けた)のどれかの状態にある。作業ディレクトリでファイルを修正し、ステージングエリアに追加し、コミットすると、ステージングエリアの内容が Git ディレクトリにスナップショットとして保存される。
注意点
Git の操作のほとんどはデータベースにデータを追加するだけなので、コミットしたものは失いにくい。一方で、まだコミットしていない変更は失われることがある。