索引(index)

索引はバイナリファイル(通常 .git/index 内に保管)であり、 ソートされたパス名と、パーミッション、blob の SHA-1値の一覧を含んでいます; git-ls-files(1) を使用すると索引の中身を参照できます:

$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0       .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0       .mailmap
100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0       COPYING
100644 a37b2152bd26be2c2289e1f57a292534a51a93c7 0       Documentation/.gitignore
100644 fbefe9a45b00a54b58d94d06eca48b03d40a50e0 0       Documentation/Makefile
...
100644 2511aef8d89ab52be5ec6a5e46236b4b6bcd07ea 0       xdiff/xtypes.h
100644 2ade97b2574a9f77e7ae4002a4e07a6a38e46d07 0       xdiff/xutils.c
100644 d5de8292e05e7c36c4b68857c1cf9855e3d2f70a 0       xdiff/xutils.h

古いドキュメントでは、"現在のディレクトリキャッシュ" または単に "キャッシュ" と呼んでいることがあります。索引には3つの重要な 性質があります:

  1. 索引は1つの(ユニークに決定される)ツリーオブジェクトを 生成するのに必要な情報全てを含んでいます。

    例えば、git-commit(1) を実行すると、索引から 新しいコミットが参照する tree オブジェクトを生成し、オブジェクトDBに 格納します。

  2. 索引は索引が定義する tree オブジェクトと 作業ツリーとを高速に比較することができます。

    これは、各エントリに対する追加情報(最終更新日のようなもの)を 格納することで行なわれます。このデータは上記には表示されず、 tree オブジェクトを作成する時には格納されませんが、 変更されているファイルと索引に格納されているファイルを 高速に確認するために使用できます。この仕組みが git がデータの 全てを読み込み変更を探す作業を手助けします。

  3. 異なるツリーオブジェクト間のコンフリクトの情報を表現することができ、 各パス名は3-way マージを行なうときに作成されるツリーの情報を 持つことができます。

    the section called “コンフリクトを解消する為の助けを得る” で見たように、マージしている間、 1つのファイルの("ステージ"と呼ばれる)複数のバージョンを格納する ことができます。git-ls-files(1) の出力の3つ目のカラムは ステージの番号で、コンフリクトしたファイルには0より大きい値が 付けられます。

このように索引は一時的な作業エリアの役割をし、 作業中のツリーの内容が詰められています。

索引を完全に消し去ると、それを記述していたツリーの名前を 持っていない限りは、全ての情報を失ってしまいます。