──「心をgitで管理する世界」の物語で、新しいのはcommitterの日付だけ
〈ショートストーリー〉
祖母の葬式のあと、家の片づけをした。
タンスの奥から、知らない祖母がいくらでも出てきた。若い頃の写真。誰かへの書きかけの手紙。畳まれたままの誰のものか分からない子ども服。長い履歴だった。私の知らないcommitが、何十年ぶんもそこに積もっていた。
全部は、継げない。
当たり前だ。祖母の八十年を、まるごと私にmergeすることなんてできない。それに ── もう、本人がいない。何をどう受け取ればいいか、聞こうにも聞けない。祖母の枝は、もうpullできない。
家を出たあの朝、私の手のひらは空っぽだった。これから自分でcommitするもので、いっぱいにするはずの手。その同じ手で、私は今祖母の遺したものの中から一つだけを握ろうとしていた。全部はつかめない。
口ぐせを選んだ。
何かあるたびに、祖母が言っていた。「ぼちぼち、ええわ」。慌てるな、という意味だったのか、もう十分だ、という意味だったのか。今となっては、確かめようがない。私の中に残っているのは、その音と、言うときに少し下がる眉だけだ。
それを、一つ、今の私に載せた。cherry-pick。彼女の履歴ごとではなく、その一行だけを。
しばらく経ったある朝。
仕事に遅れそうで、ばたばたしていた。子どもが牛乳をこぼした。私は舌打ちしかけて ── 代わりに言っていた。
「ぼちぼち、ええわ」
自分の声で。自分の口から。
言ってから、はっとした。あれは、祖母の言葉だ。なのに、今のは確かに私の言葉だった。同じ言葉。でも、祖母の、あの下がる眉は、私には付いてこなかった。たぶん私のそれは、祖母のとは少し違う意味になっている。
不思議と、それが嬉しかった。
継いだのは、コピーじゃない。私の版の「ぼちぼち、ええわ」だ。新しく私の履歴に刻まれた、私の一行。
子どもが、不思議そうに私を見ていた。この子もいつか、これを言うのかもしれない。私の口ぐせとして。祖母のものだとは、知らないまま。
それで、いいのだと思う。
〈技術ノート〉── cherry-pick
ノートは答え合わせではない。物語が嘘をついた、ちょうどその場所の地図である。
ここで、第3章の嘘が回収される
第3章で、私は「高3をmergeした」と言った。あれは嘘で、本当は一行だけを移すcherry-pickだった ── と、3章のノートで指摘した。本章は、その正しい操作を、正面からやっている。だから本章の物語は、めずらしく、ほとんど嘘をついていない。
git cherry-pickは、あるcommitの差分だけを取り出して、今いる枝に、新しいcommitとして載せる操作だ。
- 相手の履歴は継がない(祖母の八十年は連れてこない)。
- 共通祖先(merge base)も要らない(だから、もうpullできない故人からでも、記憶の中の一個なら移せる)。
- 載ったcommitは、新しいハッシュを持つ。親が違うからだ。元と同じ変更でも、別のcommitになる。
だから物語の「継いだのは、コピーじゃない。私の版だ」は、正確だ。cherry-pickは複製ではない。差分は同じでも、別のcommitとして、あなたの履歴に生まれ直す。
mergeとcherry-pick(3章との対比)
| 取り込むもの | 履歴 | merge base | 結果 | |
|---|---|---|---|---|
| merge | 相手のcommit列ごと | 連れてくる(commitはそのまま) | 要る | 二つの系譜が合流(親が二つのmerge commit) |
| cherry-pick | 一個の差分だけ | 連れてこない | 要らない | あなたの枝に、新しいcommitが一つ増える |
湿らせたい合流(内戦)はmergeの絵、精度の移植(外科手術で一個つまむ)はcherry-pickの絵 ── 3章ノートで予告した使い分けが、ここで実物になる。
物語が、一つだけ言い落としたこと
「祖母のものだとは、知らないまま」── ここに、小さなbutがある。
cherry-pickは、元のauthor(書いた人)を、既定で保持する。新しくなるのはcommitter(適用した人=あなた)と、ハッシュだ。つまり、commitはあなたの履歴に生まれ直しても、authorの欄には、祖母の名前が残る。
社会の上では、それは「私の口ぐせ」になり、子は出どころを知らずに継ぐかもしれない。だがgitの記録は、由来を消さない。受け継いだものは、自分の版になっても、authorだけは、相手のまま。
そして「少し違う意味になっている」も、技術的に正しい。同じ差分でも、適用先の文脈が違えば、効き方は変わる(文脈が食い違えばconflictすら起きる)。祖母の人生に置かれた「ぼちぼち、ええわ」と、私の朝に置かれたそれは、同じ差分・別の意味だ。
要点
- cherry-pickは差分一個の移植。履歴は継がない、共通祖先も要らない、ハッシュは新しい。 コピーではなく、あなたの版として生まれ直す。
- mergeとの違いは「履歴ごとか/一個だけか」。 3章でmergeと呼んだ操作は、本当はこれだった。
- authorは保持され、committerはあなたになる。 自分の版になっても、由来はauthor欄とblameに残る。同じ差分でも、置かれた文脈で意味はずれる。