リポジトリと履歴

オブジェクトエクスプローラー

git は複雑だという評判があります。その評判のほとんどは、モデルを一度も見たことが ないところから来ています。4 種類のオブジェクトと、ポインタ。コミットをクリック してそのツリーに着地し、自分のファイルが実はツリーに名前を付けてもらった blob その もの だとわかった瞬間、磁器(porcelain)は魔法ではなくなります。

⌘K → オブジェクトエクスプローラー。このページは 1 バイトたりとも変更できま せん — 背後の呼び出しはすべて読み取りです。

コミットのフィールド。ツリーと親がリンクになっており、その横に ref 一覧が並ぶ

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 を貼り付ければ開けます。失われたコミットの中身を、復旧するかどうか決める前に確認 する最短ルートになることがよくあります。

関連項目: コミットグラフ · リポジトリのメンテナンス · 復旧

この翻訳を GitHub で改善