VCS において Git が革新的な点

はっきりいって、Git の CUI は使いづらくてわかりにくい。サブコマンド名やオプションが開発者目線で決められており、ユーザからどう見えるかという視点が欠けている。その点、Subversion はよく考えられて洗練されていたし、それを受け継いだ Mercurial も使いやすい。LinusSubversion をこき下ろす前に Git のコマンド体系を整理すべき。

ただ、Mercurial などと比べて Git が革新的にすごい点がひとつある。それは、バージョン管理システムに Garbage Collection (GC) の概念を持ち込んだことだ。みんなあまり注目してないと思うけど、こいつはほんとうに kool な機能だ。

GC はもちろんプログラミング言語の分野での概念だけど、そのプログラミング言語の世界では、GC が一般的に使えるようになることでプログラミングスタイルが大きく変わった。それまでならメモリ管理を気にして、確保したメモリ領域を何度も使い回すスタイルだったけど、GC が普及してからは、メモリ管理を気にせず一時的なオブジェクトをじゃんじゃん生成することが当たり前になった。この、一時オブジェクトの生成を気にしないというスタイルのおかげで、プログラムを書くのがずいぶん楽になった。

Git にも同じことがいえる。Git は、使われなくなったコミットを掃除してくれる GC 機能があるので、一時的なコミットを気軽にじゃんじゃん作成できる。コードを変更したらとりあえずコミットしておく。気に入らなければ reset する。reset すると、どこからも参照されないようなコミットができちゃうけど、Git なら GC があるから気にしなくていい。

これが Mercurial だとそうもいかない。先に断っておくと、Mercurial のリポジトリは非常に洗練されており、Git の素朴な仕組みと比べると開発者のセンスが段違いに光ってる (つまり Mercurial の作者は Linus より頭いい、多分)。ただ、Mercurialリポジトリは追記型アーキテクチャなので、使いもしないコミットをじゃんじゃん作成してあとからなかったことにするという使い方や、今までのコミットを付け替える rebase のような機能にはうまくフィットしない。

Git と Mercurial のどちらがアーキテクチャとして優れているかは、結論のでない問題だと思う。かたやファイルをまるごと圧縮して差分すらとらない*1という、素朴であるがゆえに新機能を追加しやすいアーキテクチャ、かたやスクリプト言語で実装されているのに非常に高速に動作するという洗練された、しかしそれゆえに想定外の使い方には弱いアーキテクチャ。どっちのほうがすごいかは、ワシのようなものが口を出すのもはばかれる。ほんとうにどっちもすごいと思う。

ただ、Git が GC を装備していてそれが実に画期的なことであるというのは、もっと知られていいはず。ワシは Git の CUI がすごい嫌いで、GitX がなければ Git なんか使ってないんだけど、でも VCSリポジトリGC の概念を持ち込んだ Git の功績は末代まで讃えられるべきだと思う。

*1:packしなければ。