.log

miscellaneous memorandum

バージョン管理システム

September 3, 2012

バージョン管理システムと言うと、CVS、SubversionやVSSしか触ったことがなくちょっと浦島太郎状態になっているので、他の物も調べてみることにしました。とりあえずいろんなところで使われている、GitとMercurialを当たってみないことには話にならないですかね。

大きな違い

とりあえず、SubversionとGit、Mercurialの大きな違いは、集中管理か分散管理と言うことらしいですね。

分散バージョン管理Git/Mercurial/Bazaar徹底比較 - @IT http://www.atmarkit.co.jp/fjava/rensai4/devtool03/devtool03_1.html

集中管理のSubversionでは、リポジトリを中央に一個据えてそれを管理していくことになりますが、GitやMercurialなどの分散管理は、作業者がローカルにもリポジトリを持ってマスタのリポジトリのコピーを持って作業することになります。 Subversionでは、リポジトリにコミットしたらもう中身ががっつり更新されてしまいますが、分散型の場合はまず自分のリポジトリにコミットされ、その後、マスタとローカルの間で同期を取るという流れになるようですね。 何となく、現時点の私の頭の中では、分散型はより規模が大きいプロジェクトや拠点や会社が分散されているプロジェクトに向いてそうな感じなんでしょうかね。

SVN/Git/Hg比較表 - TortoiseGit Japan http://tortoisegitjapan.com/comparison/

には、機能比較表として整理されています。 ちょっと古い記事(2009年あたり)などをみると、GitやMercurialは日本語の扱いがまだちょっととか、Windows系のツールの対応が、とかいう情報もありますが、これを見る限り今では全然大丈夫そうですね。 TortoiseGitもver1.7.12、TortoiseHgもver2.4.3と十分開発が進んでいます。

どれがいいの?

さて、SubversionとGit/Mercurialは根本的な扱い方が違うということなので、じゃあこれから分散型を触ってみるにはまずGitとMercurial、どっちがいいの?というあたりを調べてみます。

GoogleはMercurialを採用 http://www.atmarkit.co.jp/news/200904/28/googlecode.html

GoogleさんはMercurialをベースにしているようです。ソフトウェアを科学する人たちの集団ですので、やっぱり色々理屈があって選ばれているはずです。 理由としては、CVSやSubversionとコマンドが似てたり、Windowsへのサポートが進んでいるとか、あとはGitはコマンドで結構リポジトリをあれこれ触りすぎることが出来るので、ということらしいです。 Gitにもメリットはあるんですが、そこはまあGoogleの中の人たちのことですから、良いところを取り込んでいいようにしているみたいです。

Linux、X.org、Ruby on Rails、Perl、Android…… http://www8.atwiki.jp/git_jp/pages/15.html

この辺をみると、有名どころがこぞってGitを採用しているようで、Railsなんかは何かするときの説明にことごとくGitを使ってソースを取ってくるようになっていたりしますね。

Mercurial 対 Git:なぜ Mercurial を選ぶのか? http://japan.blogs.atlassian.com/2012/03/mercurial-vs-git-why-mercurial/

こちらは、Mercurial押しの記事ですね。 やはりGoogleがMercurialを選んだ理由と似通った理由になっています。コマンドがわかりやすいというのはいいですね。Windowsでも使いやすいというあたりはいいですね。まあ、Gitの成り立ちがLinuxにあるということからすると、いたしかたないことですけどね。

結局……

なんかもうGit押し、Mercurial押しの情報を見ていると、何が何でもSubversionを捨てて移行しないと……みたいな勢いにさせられてしまいますが、結局の所どういう開発環境で、どういうプロジェクトなのかによってSubversionの方がいい場合もありますし、GitやMercurialの方がいい場合もあるってことでしょうかね。

そんなに大きくないプロジェクトで、普通の業務系アプリケーションを作っている限りは、分散管理したりする必要はないでしょうし、開発者それぞれがぽこぽこブランチ作って何かしたりすることもないでしょう。開発に関わっている人数が少なくて、みんなが目の届く範囲にいるなら、一部のソースをロックして「今これやってるから触らないでね」ということが出来た方がいい場合なんかもあるでしょうし、そういう場合はSubversionで十分なんじゃないかと思います。 ところが同じような条件でも、Railsなんかで開発するときにはGitの方がいいんじゃないかと思われますね。Rails関連のプロジェクトの真似をすることで参考になるケースもあるんじゃないかと思われます。

Windows環境で云々……も、実際、TortoiseGitもあってそれなりに開発が進んでいるわけですから、TortoiseSVNと同じような感覚で使えるようになっているんじゃないかと思われますし、現時点でそんなに不便なのかな?という疑問もあります。

GitもMercurialも、それぞれのプラグインでSubversionのリポジトリをマスターとして同期することが出来ますので、基本的にはSubversionを使っておいて、そこから発展的にGitやMercurialでローカルリポジトリを作ってどういう風に使うのかを習得する、と言うのが学習という意味では順当でしょうかね。

※まあ、ツールとしてどうだこうだという話はもちろん大事なんですけど、結局バージョン管理の肝になるのは、何をどう管理しますか、っていうもう一個上のレイヤーがしっかりしていないと単なるファイル共有ツールに成り下がってしまうのですよね。

アイキャッチ画像は、 http://en.wikipedia.org/wiki/File:Boxes_of_documents_on_repository_shelving_at_The_National_Archives.jpg#metadata から借りてきました。