4月8日、The GitHub Blogで「Git 20周年: Linus Torvalds とのQ&A(Git turns 20: A Q&A with Linus Torvalds)」と題した記事が公開された。この記事では、Gitの誕生から20年を迎えたLinus Torvaldsへのインタビューを通じて、Gitの開発背景や特徴、今後の展望などについて詳しく紹介されている。
以下は、GitHubでGitの開発に携わっているTaylor Blau氏によるインタビューの意訳である。興味が湧いた方は、ぜひ原文も参照していただきたい。
二十年にわたるGitの歩みを祝うため、私たちはGitとLinuxの生みの親であるLinus Torvaldsに話を伺い、ソフトウェア開発を永遠に変えたこのツールについて、その歴史とデザイン上の重要な決定、そしてGitがどのように進化し続けているのかを語ってもらった。
ちょうど二十年前の2005年4月7日、Linus Torvaldsは、Gitと呼ばれる新しいバージョン管理システムへの最初のコミットを行った。Linuxカーネル開発者たちがBitKeeperという独自ツールをライセンス上の問題で失ったことを受け、Torvaldsはわずか10日でGitを作り上げたと広く知られている。実際、最初のコミット時点で、すでにGit上でGitのコミットを行うだけの基盤が整っていた。
当時としては型破りで分散型という概念は現在ほど一般的ではなく、Gitはソフトウェアチームのコラボレーションと開発の進め方を再定義することになった(言うまでもなくGitHubの存在も象徴的だ)。
Gitが二十周年を迎えるにあたり、私たちはLinus本人にインタビューを行い、開発初期のエピソードからGitが長きにわたり成功を続けてきた理由、そしてソフトウェア開発をどのように変えたのかについて振り返ってもらった。
Taylor Blau: Gitが初めてセルフホストとして動き、初回コミットを行ってからちょうど20年が経ちました。今もなお使われ、こうして話題に上るようになるとは予想していましたか?
Linus Torvalds: 使い続けているという点では、そうかもしれない。でも、こうやって今も語られるようになるとは思っていなかった。 最大の驚きのひとつは、Gitがソースコード管理(SCM)の世界をほとんど席巻してしまったことだ。
自分の問題を解決するために作ったもので、もちろん優れているとは思っていたが、20年前の開発初期の段階でも当時のCVSよりは明らかに優れていた。でも同時に、それまで長いあいだCVSがスタンダードとして使われ続けていた現実を見ていたから、「この分野は慣性が強いな」と感じていた。「CVSにはもううんざりだから独自のものを作ろう。BitKeeperももう使えないし。自分が使えればそれでいい。他の人は気にしない」というのが当初の考え方だ。
実際、最初の数か月、あるいは数年の間は「使いにくい」「直観的じゃない」といった声も多かった。それがある時を境に一気に切り替わった感じがある。
Taylor: ではBitKeeperの話を少ししましょうか。
Linus: いいよ。
Taylor: 有名な話ですが、カーネル向けの置き換えとして、 だいたい10日間ほどでGitの初期バージョンを書いた そうですね。
Linus: そうとも言えるし、そうじゃないとも言える。カーネルに使えるようになるまでには確かに10日ほどかかったけど、実際には2004年の12月か11月頃からすでにこの問題に取り組んでいた。
当時、BitKeeperは自分にとってはかなり使いやすいツールだったけれど、ライセンス問題による論争が絶えなかった。オープンソースに興味があるLarry McVoyと知り合いではあったが、BitKeeperは商業的な側面も強く、カーネルコミュニティ全体からすると歓迎されているとは言い難い状況だった。結局、Tridge(Andrew Tridgell)がBitKeeperをリバースエンジニアしてしまったことで決定的になり、もうBitKeeperに頼るわけにいかなくなった。それで、2004年の末からずっと「BitKeeperより優れたものをどうやって作るか」「BitKeeperと同じやり方はしないようにしよう」と頭の中で考えていた。だからコードを書くまでにはすでに数か月間頭を悩ませていたんだ。いざ書き始めてから10日目くらいでカーネルに使える最低限のところまでもっていったけど、そこに至るまでに、アイデア自体はある程度固まっていたというわけだ。
「どうやってBitKeeperより優れたものを、BitKeeperと同じ方法を使わずに作るか」
Taylor: その10日間に集中してGitの開発をしていたとき、カーネルはどうしていたんです?
Linus: 2週間くらいカーネルを離れるのは、そんなに大事じゃなかった。カーネルから離れること自体は今までも数回あったしね。ユーザースペースのコードを書くのは思ったより楽だった。カーネルみたいにメモリ管理やデバッグで神経をすり減らす必要がないので、割と気楽だった。明確なゴールに向かって作れたし、ディテールは後で考えればいいというスタンスだったから、ある意味楽しい時間だったよ。
Taylor: Gitは今となっては当たり前に思える設計をしているようにも見えますが、実際には当時としては非常に斬新だったと思います。 なかでも非凡だった選択はどういった部分でしょう?
Linus: Gitが難しいと言われたのは、多くの人がCVS的な考え方から移行してきたから。自分はファイルシステムの観点からアプローチしたので、従来のSCMのやり方を踏襲する気はなかった。
自分にとってとても重要だったのは2点あって、 まずパフォーマンス。 大きなパッチを適用するときに何十分も待つなんて無理だから、一瞬で終わってほしかった。二つ目は 分散型でありながら非常に安定していること。 そのためにSHA-1を使うことにした。セキュリティというよりは破損検出目的だったんだ。BitKeeperではCRCやMD5が使われていたけど、全部を保護していたわけではなく、破損が起きると厄介だった。だからGitではすべてを強力なハッシュで守るという設計を最優先にした。そのおかげで、低レベルなところでは驚くほどシンプルな構造になっている。複雑なのはユーザーインターフェースや細かい実装部分だ。Unixにも通じる話だけど、「プロセスやファイル」という単純な概念の上に無数のディテールが積み重なる感じだね。
Taylor: SHA-1に関しては、後からSHA-256対応などもあって、いろいろと議論がありましたが、その点はどう考えていますか?
Linus: そこは後悔というか、 「必要なかったんじゃないかな」と思う部分でもある。 実際にセキュリティ面で問題が起きたわけでもないし、移行対応には労力がかかったから。でも、それはみんなが懸念したから仕方のない流れだったね。
Taylor: Gitの初期版を使っていたとき、「将来的にこれがどこまで機能拡張できるのか」という不安はありませんでしたか?
Linus: 最初にパッチ適用用の機能ができたときは、「動けばいい」って感じだった。マージの機構もデータ構造としては入っていたけど、最初のマージができるようになるまでさらに1週間くらいかかったと思う。とりあえずカーネルの方を先に進める必要があったから、エラー処理とかは最低限だったし。あと、オブジェクト形式を途中で変えたことがあって、いまでも最初期のオブジェクトはfsck
で警告が出るんじゃないかな。でも、全体的には思ったより早く使える状態になった。
Taylor: 一方で、ユーザーからの受け入れはすぐには進まなかったとのことですが。
Linus: そう。初期の数年は「難しい」「直観的じゃない」と文句を言う人が多かったね。でも、ある時期を境に急に評価が高まり始めた。
Taylor: 初期のコマンドは今でいう「plumbing(配管)」レベルでした。ユーザーフレンドリーな「porcelain(磁器)」は後から誰かが整備してくれるだろう、と?
Linus: そう。最初は自分が書いたシェルスクリプトで代用していたけど、正直使いやすいとは言えなかった。ただ、カーネル開発者はそれでもBitKeeperを使っていたくらいだから、慣れるのは早かった。公開してすぐに外部の人たちからもパッチが来て、どんどん機能が増えていった感じだ。
Taylor: では、Gitのメンテナンスを早い段階でJunio(C Hamano)さんに引き継いだわけですね。その後のコミュニティの動きを傍から見ていて、どんな感想を持っていますか?
Linus: Gitを僕がメンテナンスしていたのは本当に3、4か月くらい。2005年の8月には引き継いでいたと思う。その後はほぼ任せっぱなしだった。もちろん当時はまだGitのメーリングリストを読んでいたから、Junioが何かあれば聞いてくる、という状態。でも実際のところ、Gitは自分にとっては「Linuxカーネル開発のためにやむを得ず作ったもの」であって、そこまで思い入れはない。だから20年たって、娘が大学で 「君のお父さん、LinuxよりもGitで有名だよ」 って言われたと聞いたときは複雑だった(笑)。でも、Junioの仕事ぶりは完璧だし、彼は初期からずっと関わっていたから安心して任せられた。あとは彼が20年もメンテし続けているって事実がすごいと思うよ。
Taylor: Gitは大規模プロジェクトだけでなく、大学の授業レベルの小さなプロジェクトでも使われています。 これほど幅広く受け入れられた要因は何でしょう?
Linus: やっぱり分散型で、どんな規模でも手軽に使えるという点が大きい。従来のSCMのように「メインリポジトリ」を立てなきゃいけない、とか「移行が面倒」なんてことがない。手元でgit init
すれば即座に使えるし、他人と共有したくなったらGitHubにプッシュすればいい。それを決め手と感じた人が多かったんじゃないかな。CVS時代の煩雑さを覚えている人なら、なおさら衝撃だったはず。
Taylor: ソフトウェア開発が今後さらに変わり続ける中で、Gitはどんな役割を果たしていくのでしょうか?
Linus: そこは自分にはわからない。そもそも「自分の問題を解決したかっただけ」だから。GitHubや他のホスティングサービスのおかげで小規模な試験プロジェクトも簡単に公開・共有できるようになった。それが開発現場の流れを変えた面はあるかもしれない。でも「ソフトウェア開発そのものの本質が変わったか」というと、そこは疑問かな。
Taylor: AIだとか新技術の話も出ていますが、Git自体はどう適応していく必要があるでしょうか?
Linus: バグトラッキングやIssue管理をもっと標準化できたらいいと思う。いまは各ホスティングサービスが独自に実装していて、そこにロックインされがちだよね。Git本体が提供するわけにはいかないにしても、もう少し共有化できる仕組みがあればいいのにとは思う。
Taylor: Gitのメーリングリストはもうあまり追っていないんですよね?
Linus: そうだね。数年前までは読んでいたけど、今はほとんど見ていない。2022年の8月に最後のコミットをしたと思う。それ以降は自分用のパッチを数個持っているだけ。正直、もう自分が必要としている機能は数か月で揃ってしまったから、これ以上Gitに興味を持つ理由がない。Linuxカーネルは自分が好きな分野だから続けているけど、SCMにはそこまでこだわりがないんだ。
「Gitは、初期の数か月で自分に必要なものをほぼ満たしていた」
Taylor: ここ数年で追加された機能で、興味深いと思ったものはありますか?
Linus: マージ戦略が少し賢くなったり、スクリプトの一部がC言語で書き直されて高速化したりしたのは嬉しいね。大きな変更としてはSHA-1からSHA-256への対応が一番目立った。でも個人的にはそこまでする必要があったのかなとも思ってる。
Taylor: 関連ツールとしては何か使っていますか?たとえばtig
とか。
Linus: gitk
以外はほとんど使ったことがないね。エディタ連携系の機能も使っていない。メインエディタは昔から変わらないし、Gitとの連携なんて機能はないんだ。統計を取ると、自分が使うGitコマンドは5つくらいで、git merge
、git blame
、git log
、そしてもちろんgit commit
とgit pull
。あとはスクリプトでgit rev-list
を呼ぶくらいかな。
Taylor: 人によってはGitの良さを過小評価しているかもしれませんが、あなたはどう思いますか?
Linus: むしろ必要以上に評価されていると思う(笑)。 最初の数年は「どうしてこんなに使いにくいんだ」って文句が多かったけど、2007年から2010年の間に急に「Git最高!」という声が増えた印象だね。特にRuby on Railsコミュニティが使い始めたあたりから、若い層が最初に触れるSCMとしてGitが定番になった。それまでCVSやSVNを使ってきた人たちが「Gitは奇妙だ」と言っていたのが、いつの間にか逆転した感じだ。
Taylor: 今後のGitにとって最大の課題は何でしょう?
Linus: もうほとんどのシェアを握っているから、大きな課題はないように思う。むしろ、新しいSCMを作ろうという人たちのほうが大変だろうね。Microsoftが巨大なモノレポで運用していたときはスケーラビリティで苦労していたけど、今はもう解決しているらしいし(僕はメーリングリストを追ってないけど)。大容量ファイルを扱いたい人たちの問題も同様。Gitはそういう使い方を想定していなかったから。でも、みんながGitを使うと、当然ながらいろいろな要望や使い方が出てくるよね。それこそLinuxカーネルでも「どうしてそんなことを?」と思うような使い方をする人は出てくるものだ。
「Gitがどこにでも使われるようになると、想像もしていなかった妙な使い方をする人が出てくる」
Taylor: いまでも新しいバージョン管理システムは出てきます。PijulやJujutsu、Piperなど。試してみたことはありますか?
Linus: ないね。だって自分はそもそもSCMに興味がなかったし、Gitがあれば十分なんだよ。Gitで満足しているのに、なぜわざわざ別のツールを試す必要があるのかという感じだ。
「もともとソース管理が嫌いだった。いまは嫌いじゃなくなっただけでも進歩」
Taylor: 最後の質問ですが、Linuxが生まれてから34年、Gitが生まれてから20年。そろそろ新たな大プロジェクトを作る時期なのでは?
Linus: いやいや(笑)。自分が何かを作るのは、「世の中に欲しいものがない」という失敗の結果なんだ。LinuxにしてもGitにしても「これがないなら自分で作るしかない」ってだけ。だから、もうしばらくは新しいものを作る必要はなさそうだね。あと、自分の使い方があまり変わらないってのもある。エディタも何十年も前のままだし、もう手が慣れきっているから今さら切り替えもできないよ。
Taylor: いずれにしても、この20年間、Gitをありがとうと言いたいです。
Linus: まあ、自分のごく個人的な理由で作ったものだけど、こうして多くの人に使われるのは嬉しい。今となってはJunioや他の開発者が支えてくれているからこそ続いているわけだし、すべての功績はそちらにあると思う。
Taylor: 本日はありがとうございました。