バージョン管理は、ほとんどの開発者が日常的に行っている作業のはずだ。開発工程において、バージョン管理にまつわる大きな失敗を避けようとすれば、バージョン管理システムを使用する必要が出てくる。しかし、これは使いこなすことが難しく、また使うだけで素晴らしい毎日を送れるようになるものでもないのである。
バージョン管理について開発者の口から出てくるのは、たいていが不満であり、その不満は特に従来のシステムに対するものが多い(開発やサポートが終了し、世の中から姿を消そうとしているものに不満が集中しているのは、不幸中の幸いと言えるかもしれない)。しかし筆者は、尊敬している知人たちが分散バージョン管理システム(DVCS)の良さを口にしているのを耳にしたため、このシステムについて調べてみることにした。そこで本記事では、DVCSについて筆者が今回調査した内容に基づき、従来のバージョン管理システムとの違いや、多くの開発者たちに好まれている理由について説明する。
DVCSと従来のバージョン管理システムは、どこが違っているのか
DVCSと従来のバージョン管理システムの主な違いは、リポジトリを配備する場所にある。
従来のバージョン管理システムでは、中央リポジトリにすべてのファイルのマスターコピーが格納されている(場合によっては、パフォーマンスや冗長性といった観点から複数のノードにミラーリングされている)。このため開発者は、自らのローカルディスク上に個人的なコピーを作成し(チェックアウト)、その内容をマスターコピーに反映したい際にはチェックインを行うようになっている。ユーザーはリポジトリ上のファイルにロックをかけることで、ファイルの内容が変更中である旨を他者に知らせることができる。そしてファイルが複数のユーザーによって個別に変更されている場合、リポジトリにチェックインする時点で、サーバ上にある該当ファイルの内容と、チェックインする内容の差分を解決する必要がある。何らかの実験を行ったり、異なるバージョンを作成したいという場合には、コードツリーを分岐させることで、まったく異なったコピーを作成することができる。また、最終的に2つのツリーを1つにマージすることもできるものの、その際にもそれら2つのツリーの差分を解決する必要がある。
DVCSはこういったやり方を変えることになる。中央サーバ上に中央リポジトリを配備するのではなく、開発者それぞれが自らのリポジトリを保持することになる(このため「分散化」と呼ばれるわけだ)。この形態はピアツーピアのネットワークに似ている。これにより、従来のバージョン管理システムよりも冗長性を高くすることが可能になる。このこと自体は目新しい考え方ではない。大きな違いはチェックインに対するアプローチである。従来のシステムでは単にファイルを置き換え、新たなバージョン番号を付与するようになっているのに対して、DVCSではチェンジセットというものを用いるようになっている。このチェンジセットはチェックインを行うたびに1つ作成される。このため、ツリー中にある最初の(同じ)ペアレントに対して2人の開発者が個別に変更を加える場合、並行した2つのブランチが自動的に作成される。このようにすることでシステムは、2つのブランチ間における実質的な違いの内容を把握できるようになるため、バージョン番号が異なった2つのファイルを単に比較することになるシステムに比べると、簡単にマージが行えるというわけだ。このトピックについては、MercurialのWikiに詳しい説明があるので、参考にしてもらいたい。