Subversion/Git/Mercurialのバージョン管理について

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

バージョン管理システムで代表的となっているGit、Subversion、Mercurialだが、それぞれ似たような点を持っている一方で、それぞれ違いがある。ここではGitのコミットIDとSubversionとMercurialのリビジョン番号に着目して少々述べてみたい。

GitのコミットID

Gitではリビジョンではなく、コミットID ((コミット識別子とも)) と呼ばれるコミット情報 ((変更したファイル名やコミッターの情報、コミットメッセージなど)) をSHA1でハッシュしたものがバージョンを識別するIDとなっている。

これは、分散型バージョン管理システムでSubversionのような連番のリビジョンを使うとそれぞれのリポジトリーでの整合性を確保できないからであると考えられる。

これによってそれぞれのリポジトリーで整合性を確保していると考えられるものの、ユーザーにとってはリビジョン番号と比較するとかなりわかりづらいものとなっている。リビジョン番号であれば数字で説明することも可能だが、コミットIDの場合は補助ツールを使わない限りコミットIDを指定するのがかなり面倒だからである、

とはいえ、重要な部分でタグをつけたりすることで、ある程度は面倒さを回避することは可能と考えられる。

Subversionのリビジョン番号

Subversionでは対照的に、リビジョンと呼ばれるバージョンの概念がある。これはSubversionにおけるバージョンを示す識別子だが、Subversionにおいてはコミットされるごとにリポジトリのリビジョン番号が加算されるシステムを採用されている。

分散型バージョン管理システムとは違い、(git-svnやhgsvnなどを使わない限り)バージョン管理を行うのは中央サーバーのみであるため、シンプルなリビジョンで十分であるほか、どのリビジョンかを比較的容易に指定できる特徴がある。

ただし、集中バージョン管理システムではgit-svnやhgsvnなど、ローカルのリポジトリーをgitあるいは後述のMercurialなどで管理するツールを使わない限り、サーバーのリポジトリーが破壊されたら再起不能になるリスクが比較的高い。

Mercurialのリビジョン番号とチェンジセットID

なお、Mercurialは分散型バージョン管理システムだが、Subversionと同じようにリビジョン番号を採用しているが、これはあくまでローカルリポジトリー専用のものであり、グローバルで使うものとしてははGitに近いチェンジセットIDが採用されている。

これによって、ローカルにおいてはリビジョン番号を指定するという使い方ができるという利点があるものの、他のリポジトリーが絡むとそれぞれのリポジトリーでは別のリビジョン番号が割り当てられる可能性が高く、リビジョン番号という意味では整合性を犠牲にしている側面がある。

この点からローカルならSubversionのような使い方がある程度可能で、なおかつGitの分散リポジトリシステムの利点を受け継いでいるように見える。

最後に

それぞれのバージョン管理システムのリビジョン及びコミットIDなどを調べるにつれて、そのバージョン管理システムのあり方の違いから、どういう風に対処しているのかがなんとなく見えてきた気がする。

それぞれのシステムには利点と弱点を持っているので、目的や使いやすさを勘案した上で最も合ったものを使っていきたいところである。

タイトルとURLをコピーしました