──「心をgitで管理する世界」の物語で、originは人の数だけある
〈ショートストーリー〉
朝、母から電話があった。
「あんた、ちゃんと食べてるの。昔から、気が小さくて、無理ばっかりするんだから」
私は笑って、うん、と答えた。
母の中の私は、まだ、すぐ熱を出して寝込んでいた、あの頃の私だ。とっくに、無理くらい平気でできるようになった。でも、訂正はしなかった。母がfetchしたのは、たぶん十年以上前だ。それきり、更新していない。母は、古い私に向かって喋っている。それを直す気には、なれなかった。母のところでは、私はまだ、守られるべき子どもでいられた。
昼、会社で同僚に言われた。
「ほんと、何があっても動じないですよね。羨ましいです」
私はまた、笑ってごまかした。
動じていないわけがない。会議の前は、いつも机の下で手を握っている。ただ、会社の私は、それを見せない。落ち着いた、そつのない大人を、毎日演じている。背伸びを、続けている。同僚がfetchしているのは、その、背伸びした私だけだ。彼の中に、机の下で手を握る私はいない。
夜、恋人と電話で話した。
「あなたって、おっちょこちょいだよね。一緒にいると、肩に力が抜ける」
私は少し、黙った。
朝、母は言った。気が小さい子だと。昼、同僚は言う。物怖じしない人だと。同じ私の話をしているのに、二人の語る私は正反対だった。
どちらも、嘘じゃない。母の中の私も、同僚の中の私も、恋人の中の私も、どこかの時点のどこかの私だ。母は十年前の私を、恋人は夜の私だけを、それぞれ別の時刻に別の場所でfetchした。だから食い違う。誰も間違っていない。
電話を切って、私は自分のrepoを開いた。せめて、自分の中になら答えがあるはずだと思って。
どれが、本当の私なんだろう。
会社の枝。恋人の枝。一人の枝。どれかが「本物」で、ほかは演技、というわけではなかった。どれも、ただの文脈の枝だった。そして、それらを束ねる「これが本当の私だ」という一本の幹は ── どこにも無かった。
探して気づいた。gitには、もともとそんな特別な一本なんて無い。
母の手首にも、同僚の手首にも、恋人の手首にも、それぞれのorigin/私がいるのだろう。私には覗けない。他人のリポジトリは、覗けないから。覗けないまま、たぶん三つとも違う。同じorigin/私という名前なのに。
originというのは、ただ、gitがcloneのときに既定でつける名前にすぎない。「本物」という意味は、どこにも付いていない。みんなが、それぞれのorigin/私を本物だと思って喋っているだけだ。
そして ── いちばん足元が崩れたのは、ここだった。
私自身の中にも、本物はなかった。
私が見られるのは、今この瞬間、たまたまcheckoutしている、一つの枝だけだ。私も、自分の「全部」を一度には持てない。母が持つ私も、恋人が持つ私も、私自身には外から見えない。私は、自分のことを誰よりよく知っているつもりで ── 自分が、みんなにどう映っているかを、誰より見られずにいた。
その夜、私はもう一度母に電話をかけた。
用なんてなかった。ただ、声が聞きたかった。
「どうしたの、珍しい」と、母は笑った。母の中の十年前の私に向かって。
それでよかった。
本物の私がどこにも無いのなら。せめて、誰かの中の少し古い私がまだ大事にされている。それだけで、よかった。
母は、まだ私を無理ばかりする子だと思っている。
その夜だけは、私はその古い私にcheckoutした。「ちゃんと、食べてるよ」と、少しだけ子どもの声で。
それは、嘘で、嘘ではなかった。
〈技術ノート〉── 複数リモート
ノートは答え合わせではない。物語が嘘をついた、ちょうどその場所の地図である。
物語が嘘をついた場所
「どこかに、本物の私(source of truth)があるはずだ」── この前提が、嘘だ。
gitに、唯一の正しい版(source of truth)は、構造的に存在しない。
多くの人が、originを「本物の置き場所」だと思っている。だがoriginは、git cloneしたときに既定で付くリモートの名前にすぎない。upstreamでもmomでも、好きに付けられる。どれかが本物だ、という特権は、gitの側には無い。誰かが「これを基準にしよう」と取り決めたときにだけ、その一本が、便宜上の「正」になる。約束であって、事実ではない。
だから、母の中のorigin/私、同僚の中のorigin/私、恋人の中のorigin/私は、同じ名前なのに、中身が違う。それぞれが、別々の時刻にfetchした、別々のキャッシュだからだ。名前が同じ(origin)でも、本物だと保証するものは、何もない。食い違って、当然だ。誰も間違っていない。ただ、最後に同期した時刻が、違うだけ。
そして、リモートは一つではない。関係ごとにgit remote addでき、それぞれをfetchする頻度(cadence)も、ばらばらでいい。あなたは、たくさんの人の手首の中に、少しずつ古いorigin/私として、散らばって存在している。
物語が、いちばん深く突いたこと
「私自身の中にも、本物は無かった」── これは、正確だ。
あなたのrepoにも、「全部入りのあなた」は無い。HEADは、一度に一つの枝しか指せない。今checkoutしている自分しか、その瞬間には生きられない。しかも、他人のclone(母や恋人が持つあなたの版)は、こちらから覗けない。
つまり、あなたの「本物」は、世界のどこにもmaterialiseされていない。 各リモートに散らばった、別時刻のキャッシュの集合があるだけ。一貫した一人の自分、というのは、git的には、はじめから幻想だ。
正しい名前
| 物語の言葉 | gitの正名 |
|---|---|
| 母・同僚・恋人が、それぞれ持つ私 |
複数のremoteとorigin/私 =各人のrepoに、その人がfetchした私のキャッシュがある |
| 同じ名前なのに、中身が違う |
originは既定名にすぎない=「本物」を保証しない。cadenceが違えば食い違う |
| どれが本当の私か | source of truthはgitに無い=どの枝・どのoriginにも、特権は無い。「正」は慣習で決まるだけ |
| 自分自身にも見えない | HEADは一度に一つ=自分のrepoでも全ブランチを同時には生きられない/他者のcloneは覗けない |
要点
-
originは「本物」ではない。 gitがcloneで既定につける名前にすぎず、特権は無い。みんなが持つorigin/私は同名でも別物。 -
各
origin/私は、最後にfetchした時点のキャッシュ。 cadenceが違えば食い違う。誰も間違っていない、時刻が違うだけ。 - 自分でさえ、自分の全部を一度には持てない(HEADは一つ)。 あなたの本物は、どこにも置かれていない。