オブジェクトエクスプローラー
git は複雑だという評判があります。その評判のほとんどは、モデルを一度も見たことが ないところから来ています。4 種類のオブジェクトと、ポインタ。コミットをクリック してそのツリーに着地し、自分のファイルが実はツリーに名前を付けてもらった blob その もの だとわかった瞬間、磁器(porcelain)は魔法ではなくなります。
⌘K → オブジェクトエクスプローラー。このページは 1 バイトたりとも変更できま
せん — 背後の呼び出しはすべて読み取りです。

4 つのオブジェクト
| オブジェクト | 正体 | 知っていること |
|---|---|---|
| blob | ファイルの内容 | 何も。名前も、パスも、履歴も知りません |
| tree | ディレクトリの一覧 | 名前、モード、そして子の blob やツリーそれぞれの sha |
| commit | 1 つのスナップショット | そのツリー、その親、author、committer、メッセージ |
| tag | 注釈付きタグ | 指しているオブジェクト、タグを付けた人、メッセージ |
ほとんどの人にとって意外なのは最初の行です。blob には名前がありません。 履歴の どこにあろうと内容が同一の 2 つのファイルは同じ blob であり、保存されるのは一度きり です。名前はそれを指すツリーの側にあります — だから git はファイルではなく内容を追跡 するのであり、だからリネームは記録されるのではなく検出されるのです。
ref — refs/heads/main、refs/tags/v1.0、HEAD — は sha を書いただけのファイル
にすぎません。「ブランチを切るのは安い」という話は、これで全部です。
たどり方
左の列にはリポジトリのすべての ref が、git がまとめるとおりにまとめて並びます。 どれかをクリックすると、それが名指すオブジェクトに着地します。
そこから先はすべてがリンクです。
- commit はその
treeと各parentを表示します — スナップショットへ入るのも、 履歴を 1 コミットずつさかのぼるのも自由です。 - tree はエントリをモード、種類、sha、サイズとともに並べます。名前をクリックする とその子が開きます。
- blob はテキストを表示し(大きいものは先頭だけ)、バイナリならそうはっきり伝え ます。
- 注釈付きタグ は何を指しているかを表示します — そこからコミットへ入れます。
戻る で来た道を引き返せます。
リビジョンの入力
入力欄は git rev-parse が受け付けるものなら何でも受け付けます。ここがこの画面が
ブラウザであることをやめ、学ぶための道具になる場所です。
| これを入力 | 得られるもの |
|---|---|
HEAD |
現在のコミット |
HEAD~3 |
3 つ前のコミット |
HEAD^{tree} |
そのコミットのツリー、皮をむいたもの |
HEAD:src/app.ts |
そのパスの blob を直接 |
v1.0^{} |
タグオブジェクトではなく、注釈付きタグが指している先 |
a1b2c3d |
sha による任意のオブジェクト — 短縮形も使えます |
ツリー一覧のモード数字は覚えておく価値があります。100644 はファイル、100755 は
実行可能ファイル、040000 はサブツリー、120000 はシンボリックリンク、160000 は
サブモジュールの gitlink — 最後のものが、サブモジュールが保存している内容のすべて
です。
知っておくべき制限
- 読み取り専用なのは意図的です。 ここには書き込むための道具がありません。手で
オブジェクトを作るのは
git hash-objectの練習であり、その居場所はターミナルです。 - 大きな blob は切り詰められます — 最初の 200 KB まで。何であるかを見るには十分 で、ウィンドウを固まらせるには足りない量です。
- サイズは
git cat-file -sが報告するオブジェクトの内容サイズ であって、パック 後のディスク上の消費量ではありません。そちらは メンテナンス を参照してください。 - 到達不能なオブジェクトもオブジェクトです。
git fsckの dangling 報告から sha を貼り付ければ開けます。失われたコミットの中身を、復旧するかどうか決める前に確認 する最短ルートになることがよくあります。
関連項目: コミットグラフ · リポジトリのメンテナンス · 復旧