SubversionとGitの違い

subversion_svn-git-scm

SubversionとGitの違い

SubversionとGitの大きな違いは、Subversionのような単一型リポジトリ管理方式か、Git/Mercurial のような分散型リポジトリ管理方式です。

 

2010年にはSubversionがソフトウェアの共同開発に欠かせないツールであるバージョン管理システムの60%以上を占めていた。この時期、Gitのシェアは2.7%であった。今日ではGitのシェアが28%と急拡大しているというデータがある。
reawrite.jp「Git 対 Subversion:長引く争い」

   

 これからは分散型が主流になることが予想されるが、企業環境では過去の資産活用や教育等によりすぐに最新のツールに切り替えることは難しいと考えられます。

 この資料ではSubversionを代表とする単一リポジトリ型とGitを代表とする分散リポジトリ型の特徴についてまとめ、SubversionとGitを利用する参考資料となることを目指します。

Subversionによる単一リポジトリ

 Subversionによるバージョン管理システムは、単一リポジトリ型(中央リポジトリ)の版管理システムです。CVSやSubversionがこの仕組みを採用しています。単一型リポジトリでは、プロジェクトにリポジトリは1つしかありません。

 開発者Aは1つのリポジトリから自分の開発マシンに「作業コピー」といわれる単一リポジトリの最新版のソースコードを取得します。開発者Aはその作業コピーに対して変更作業、つまり新機能開発や修正を行います。変更作業の区切り毎に単一リポジトリに対して変更点を登録します。

 この登録は「コミット」と呼ばれ、コミットが正常に実行されると単一リポジトリに開発者Aの変更が反映され、別の開発者Bが「作業コピー」を取得したときに開発者Aの修正が反映されたソースコードを取得することが出来ます。  このように単一リポジトリの作業 最新版の作業コピーを単一リポジトリから取得し、開発を行う。開発の区切り毎に単一リポジトリにコミットを行い、最新版のソースコードを登録する。

Subversionによる単一リポジトリ

Gitによる分散リポジトリ

 Gitによるバージョン管理システムは、分散リポジトリ型の版管理システムです。 GitやMercurialがこの仕組みを採用しています。分散リポジトリはリポジトリ自体が複数存在し、分散しています。また分散リポジトリはすべて同じ情報を保持しています。  開発者Aは開発作業をする前に、別の分散リポジトリ(便宜上、マスタリポジトリとする)からクローンと呼ぶ複製を自分の開発マシンに作成します。ソースコードに対する変更作業の区切りが付いた時にコミットする点は単一リポジトリと同じです。分散リポジトリは複数のリポジトリがあるため、相互のリポジトリを同期させる必要があります。各リポジトリの所有者が他のリポジトリの差分を取得します。

 下図にある「中央リポジトリ」とは開発者全員で共有するリポジトリです。マスタリポジトリと呼びます。このマスタリポジトリは開発者が持っているリポジトリと同じです。マスタリポジトリのみ特別な機能を持つわけではありません。そのため、マスタリポジトリは開発チーム内で運用上決められて利用されているリポジトリです。

Gitによる分散リポジトリ

まとめ

単一リポジトリ型は中央リポジトリを1つだけ持ち、開発者全員が中央リポジトリに対して操作する。分散リポジトリ型はリポジトリが複数有り、開発者が所有する。運用ルールとしてマスタリポジトリを運用する。マスタリポジトリは単一リポジトリと同じような運用が可能である。 分散リポジトリ型が単一リポジトリよりも管理方法が複雑になるが、以下のメリットが考えられます。

  1. 開発者自身で自由に操作することが出来るリポジトリを持つことが出来る これにより、試験的な機能や実験的なコード施策が可能

  2. Git/Mercurialはブランチ及びマージ機能が優れている

  3. 開発者自身のリポジトリはマスタリポジトリと同じであり、持ち運ぶことが出来る これにより、ネットワークから隔絶された環境や本番環境に影響しない 試験的なコードを実験することが可能

分散リポジトリ型のデメリットも考えられます。 単一リポジトリに比べコミット時のリビジョン番号が分かり辛い点があります。リポジトリが分散しているため連番を振ることが難しいためです。 リポジトリを複数作成することが出来るため、運用を正しく行わないとどこにコミットされたのか分からなくなってしまう場合があります。

 最後に、分散リポジトリ型が主流になることが予想されますが、単一型(集中型)リポジトリから分散型リポジトリに切り替えるためには、新しいツールの使い方を学ぶだけでなく、考え方を変える必要があります。開発方法や運用ルールについても学ぶ必要があります。

Comments are closed.