──「心をgitで管理する世界」の物語で、死は delete ではなく read-only だ
〈ショートストーリー〉
最近、pushが通らない。
commitは、まだできる。今日のことを書き留めようとはする。けれど、それを先へ送り出す力が、もう残っていない。私の枝は、少しずつ動かなくなっていた。あのいつかも、ついにread-onlyになった。
歳を、とったということだ。
若い頃、私をいちばん哀しくさせたのは、いつもこれだった ── 誰もが、少し古い相手と喋っている。私の中の田中は十八歳で止まり、母の中の私は、無理ばかりする子で止まっていた。みんな、互いの古いキャッシュに向かって喋っていた。それが、寂しかった。
今、その寂しさが、裏返ろうとしていた。
私が、古いキャッシュになる番だった。もう更新されない私が、これから、みんなの中に残る。
子が、来た。
ずいぶん前に、私からforkして出ていった子だ。あの朝の、私と同じだ。家を出て、自分のoriginを持って、それきりほとんどpullしなくなった。私が母にそうしたように。
責めなかった。責められるわけがない。forkとは、そういうものだ。pullをやめることが、独り立ちだ。私だって、玄関で、母の「たまには帰ってきなさい」をpullせずに出ていった。
子の中の私は、もう、だいぶ古いのだろう。それでいい。
母は、とっくにtagになっていた。ある日から、どうしてもpullできなくなった。upstreamが、応答しなくなった。それが、母の死だった。今でも、会いには行ける。checkout 母。あの台所の匂いも、小言も、そこにある。読み取り専用のまま。新しい一日を書き足すことは、もうできない。
私も、じきにそうなる。
最後に、一つ、commitしようと思った。
長い履歴だった。背伸びして、整えて、見栄えよくしようとしたcommitが、いくつもあった。今となっては、どれもおかしい。いったい、誰によく見せたかったのか。
最後の一行くらいは、背伸びをやめよう。
私は、手のひらを開いた。家を出たあの朝、空っぽだった手。あれから、たくさんのものを握ってはcommitしてきた手。今は、もう、何も握れない。差し出すことしか、できない。
「今日も、空が、きれいだった」
それだけを、commitした。誰に見せるためでもない。グラフの、緑のためでもない。ただ、本当のことだったから。
pushは、しなかった。する力も、もうなかった。でも、それでよかった。これは、私だけの、最後の一行だ。
そして、私は、tagを打たれる側になった。
名前のついた、動かない一点に。きっと、誰かが、短いメッセージを添えるのだろう。生まれた年と、死んだ年と、ひとことくらいの、何かを。墓碑のような、annotatedなtagを。
もう、pushはできない。新しい私を、足せない。
でも ── fetchは、される。
子が、妻が、いつか、私をcheckoutするだろう。私が、母の台所に会いに行ったように。checkout 父さん。そこには、少し古い、けれど確かな私がいる。読み取り専用のまま。
私の「本当」は、最後まで、どこにもまとまらなかった。
子の中の私と、妻の中の私と、田中の中の、十八歳のままの私。みんな、別の時刻の、別の私だ。もうmergeされることは、ない。私がpushできないから。本物の私は、とうとう現れなかった。
それで、いいのだと思う。
きっと子は、いつか、私の口ぐせを言う。知らずに。私が、祖母のそれを継いだように。cherry-pickされた、私の一行。authorの欄には、たぶん、まだ私の名前が残っている。
私は、消えない。少し古いまま、あちこちに散らばって、残る。
それが、寂しいことなのか。あたたかいことなのか。
私には、もう、分からなかった。
子が、私の手を握った。
握り返す力は、もうなかった。
ただ、誰かが、私をcheckoutする気配だけがした。世界が、ゆっくりとやわらいでいく。あの、はじめてcheckout 高3をした日の、あの感じによく似ていた。
今日も、空が、きれいだ。
〈技術ノート〉── 最後のタグ
ノートは答え合わせではない。物語が嘘をついた、ちょうどその場所の地図である。
物語が嘘をついた場所
「死で、全部が消える」── 私たちがいちばん深く信じている、この嘘を、最後に正す。
gitでは、消えない。死とは、消滅ではなく、読み取り専用化(read-only)だ。
- pushが、できなくなる。 新しいcommitを、もう共有リモートへ送れない。つまり、新しい一日を、他者との関係に書き足せない。それが、死だ。
-
だが、tagは残る。
tagは、特定のcommitを指す、動かない ref。一度打たれたら、ブランチのように先へは進まない。第3章の「高3タグ」と、まったく同じ仕組みだ。 - そして、fetchはされ続ける。 読み取り専用でも、他者は、あなたをcheckoutできる。会いに行ける。読める。ただ、そこに新しい一日を書き足せないだけ。
母が「ある日からpullできなくなった」のは、母のrepoがpushを止めた=読み取り専用になった、ということ。upstreamの応答が消えた。それでもcheckout 母で、母には会える。これが、gitにおける死の、正確な姿だ。
annotated tag=墓碑
tagには、二種類ある。
- lightweight tag ── ただの名札。commitを指すだけ。
- annotated tag ── それ自体が一つのオブジェクトで、打った人(tagger)・日付・メッセージ・署名を持つ。
墓碑は、annotated tagだ。名前、年、ひとことの言葉、そして「確かにこの人がいた」という署名。lightweightな、ただの日付ではなく、メッセージを添えて、人は人をtagにする。
第3章の高3タグは、生前の読み取り専用だった。会いに行けるが、二人とも新しい一日を書き足せない、あの場所。最後のタグは、それが全部に及んだ状態にすぎない。構造は、同じ。違うのは、もう、どの関係にもpushできないこと。
本物は、最後まで現れない(そして、それでいい)
pushが止まった瞬間、各人が持つ別時刻のorigin/わたしは、二度とmergeされない。子の中のあなた、妻の中のあなた、旧友の中の十八歳のあなた ── それらを束ねる本物は、永遠に現れない(第5章の結論が、ここで確定する)。
代わりに、あなたの一行は、生者にcherry-pickされ続ける。受け継がれた口ぐせ、仕草、考え方。それは新しいハッシュで、相手の版になるが、authorの欄には、あなたの名前が残る(第6章)。読み取り専用になっても、断片は、生き続ける ── 由来を保ったまま。
正しい名前
| 物語の言葉 | gitの正名 |
|---|---|
| もうpushできない/commitを足せない | 読み取り専用化=新しいcommitを共有リモートへ送れない=死 |
| tagを打たれる側になる | tag=特定commitを指す不動のref(3章の高3タグと同構造) |
| 墓碑のようなメッセージを添える | annotated tag=tagger・日付・メッセージ・署名つき(cf. lightweight tag=名札のみ) |
| 会いには行ける/checkoutされる | 読み取り専用でもfetch・checkoutは可能=読めるが、書き足せない |
| 各人の中の、別時刻の私 |
各cloneのorigin/わたし =pushが止まれば、二度と収束しない |
| 子が知らず口ぐせを言う | cherry-pick(author保持) =読み取り専用でも、断片は生者に継がれうる |
要点
- 死=消滅ではなく、読み取り専用化。 push(新しいcommitの共有)はできなくなるが、tagは残り、fetch・checkoutされ続ける。会えるが、書き足せない。
- 墓碑はannotated tag。 tagger・日付・メッセージ・署名を持つ。3章の高3タグ(生前の読み取り専用)と構造は同じ。違うのは、それが全部に及ぶこと。
-
本物は最後まで現れず、代わりに断片がcherry-pickで継がれる。 各人の
origin/わたしは二度とmergeされないが、あなたの一行はauthorを保ったまま、生者の中に残る。
つながり(連作を閉じる)
- 第3章tag / merge base:高3タグ(生前の読み取り専用)⇄ 最後のタグ(死=全部が読み取り専用)。環が閉じる。
- 第1章clone / fork:私が母からfork ⇄ 子が私からfork。pullをやめることが独り立ち=巣立ち。鏡像。
- 第4・5章fetch遅延/本物の不在:全篇の哀しみ(誰もが古い相手と喋る)が、ここで反転 ── 私自身が、みんなの中の「もう更新されない、少し古い私」になる。
- 第6・11章cherry-pick/blame(author保持):読み取り専用になっても、一行は継がれ、author欄に残る。