git-commit(1)、git-checkout(1)、git-reset(1) のような高レベルの操作は作業ツリー、索引、オブジェクトDB間の データを移動することによって仕事をします。 Git はこれらの各ステップを独立に行なう下位レベルの操作を提供しています。
一般に、全ての "git" 操作は索引ファイル上で作用します。 いくつかの操作は 純粋に 索引ファイル(現在の索引の状態を表示) 上で作用しますが、ほとんどの操作は索引ファイルとデータベース又は 作業ディレクトリ間のデータを移動します。従って、主に4つの組み合わせがあります:
git-update-index(1) コマンドは作業ディレクトリの情報を 索引に更新します。一般には更新したいファイルを特定して 索引の情報を更新します、次のように:
$ git update-index filename
しかし、ファイル名を補完した際などの間違いを防ぐため、 このコマンドは新しいエントリや削除された古いエントリを 自動的に追加することはありません。即ち、存在するキャッシュエントリを単に更新するだけです。
あるファイルを削除する場合は —remove
フラグを、
新しいファイルを追加する場合は —add
フラグを使用します。
注意! —remove
フラグを使用しても必ずしもそのファイルが削除される
わけではありません:ファイルがディレクトリ内にまだ存在する場合、
索引は新しいステータスに更新されますが、ファイルは削除されません。
—remove
はファイルが削除されたのが正しいことであることが
索引の更新時に考慮されることを意味しているだけであり、
もしファイルが本当に存在しないのなら索引をそれに従い更新するだけです。
git update-index —refresh
という特別なオプションもあります。
これは現在の "stat" 情報に一致する各索引の "stat" 情報を
リフレッシュします。オブジェクトのステータス自身は更新せず、
オブジェクトが過去に格納されたオブジェクトとまだ一致している
かを素早くテストする為に使用されるフィールドだけを更新します。
以前紹介した git-add(1) は git-update-index(1) の 単なるラッパースクリプトです。
現在の索引ファイルを "tree" オブジェクトに書く為には、プログラム
$ git write-tree
を使用します。これにはオプションがありません。— これは その状態を記述する現在の索引をツリーオブジェクトの集合へと 書き出す役目をし、トップレベルのツリーの名前を返却します。 このツリーはいつでも索引を再生成する為に利用できます。
オブジェクトDBから "tree" ファイルを読み込み、現在の索引を そのツリーの状態と同じにするには次のようにします。 (索引が後で元に戻す可能性がある未保存の状態を含む場合にはこれをしないでください!)
$ git read-tree <SHA-1 of tree>
これにより索引ファイルは過去に保存したツリーと同じ状態になります。 しかし、それは index ファイルに対してだけです:作業ディレクトリは 何も変更されていません。
次のようにすると、作業ディレクトリを索引の状態に 更新することができます。
$ git checkout-index filename
あるいは、全ての索引をチェックアウトしたい場合は -a
を使用します。
注意! git checkout-index
は通常、古いファイルを上書きすることを居します。
従って、チェックアウト済みの古いバージョンのツリーを持っている場合、
("-a" フラグ又はファイル名の前に) "-f" フラグを使用し、強制的に
チェックアウトする必要があります。
最後に、一方から他方への純粋な移動ではないものを説明します:
"git write-tree" で作成したツリーをコミットするには、 そのツリーと背後にある履歴(つまり、その履歴とつながる"親の"コミット) を参照する "commit" オブジェクトを作成します。
通常 "commit" は一つの親を持ちます:これはある変更を行った一つ前の ツリー状態を指しています。しかしながら時には二つ以上の親を持つこと もあります。それは "マージ" と言われる場合であり、そのようなコミットは 二つ以上の状態を一つに纏めます。
言い換えると、ツリーがある作業ディレクトリの特定の状態を表す一方、 コミットはその状態の時刻とそこに至った経緯を表します。
コミットを作成するには、コミット時点の状態を表すツリーと親のリストを 渡すことで作成することができます:
$ git commit-tree <tree> -p <parent> [-p <parent2> ..]
コミット時のコメントは標準入力(あるいはパイプやファイルのリダイレクト) で指定します。
git commit-tree
は作成したコミットのオブジェクト名を返却します。
通常、この名前は .git/HEAD
ファイルに保存され、その結果、
最後のコミットが何であるかを確認できます。
以下は Jon Loeliger が作成したテキストのイラストで、 項目間の関係を示しています。