Git/分散レポジトリって何が嬉しいの
Git は分散レポジトリ型の版管理システムです。 他にも Mercurial とか SVK とか分散レポジトリ型の版管理システムが最近流 行ってます。 では、分散レポジトリ型って何がいいんでしょうか。 この文章では単一レポジトリ型と分散レポジトリ型の特徴について書いておきたいと思います。
急ぐ方は、ページの一番下にある「まとめ」を参照してください。
用語
この文書内で使う用語について。 なんらかの版管理システムを使ったことのある人にとっては聞きなれた言葉だと思うけれど、一応。
- レポジトリ
- ファイルの履歴情報などが格納されたデータベースのこと。普通はプロジェクト毎に用意されることが多い。レポジトリに登録されている各ファイルは、変更が行われ登録(コミット)されるごとに、リビジョン番号とファイルの内容が関連付けられて保存される。
- ワーキングコピー
- レポジトリ中の特定のバージョンをファイルとして取り出した(チェックアウトした)もの。
単一レポジトリ型とは
CVS や Subversion に代表される単一レポジトリ型の版管理システムでは、プ ロジェクトのレポジトリはひとつしかありません。 プロジェクトの作業者は、レポジトリから自分のワーキングコピーを取り出し、 それに対して変更作業を行います。 変更作業が一区切りついたら、レポジトリに対して変更点の登録(コミット)を 行うことになります。
図にするとこんな感じになりますでしょうか。 他人に影響を与えずに、各個人が自由に編集できるのはピンクの四角の中です。 ワーキングコピーだけが個人の自由領域となっているのが分かりますね。
ワーキングコピーは履歴を保持することが出来ないので、履歴を保持するため には変更点をレポジトリに登録(コミット)する必要があります。
分散レポジトリ型とは
Git や Mercurial や SVK で使われている分散レポジトリモデルでは、名前の とおりレポジトリが分散して複数存在します。 ワーキングコピーと1対1となる形で存在することが多いようです。
ワーキングコピーに対して作業を行い、ひと区切りついたところでレポジトリ にコミットする点は単一レポジトリ型の場合と変わりません。
分散レポジトリ型の場合は各人がそれぞれレポジトリを保持しているため、他 人に影響を及ぼさずに変更出来る範囲(ピンクの四角)がレポジトリを含みます。 コミットしても(他の人が参照しない限り)他の人に影響が無いのです。
レポジトリが複数あるので、同期を取るためにはレポジトリ間の通信が必要に なります。 各レポジトリの所有者が他のレポジトリから変更点を取得する(図の上の方の矢 印)ことになります。
運用の方法次第では、単一レポジトリ型レポジトリと同じように使うことも出 来ます。 その場合は下図のような構成になるでしょう。
「マスタレポジトリ」と書いてあるのが、全員で共有するレポジトリです。 マスタレポジトリは他のレポジトリと何ら変わらないことに注意してください。 皆がそれをマスタとして使うと運用上決めただけのことなのです。 マスタレポジトリにしか無い特別な機能はありません。
プロジェクトは成果物を提供する必要があるため、多く場合は(そう呼んでいる かは分かりませんが)マスタレポジトリが存在します。 ここに登録されたコードを公式に配布する「決まり」で運用しているだけです。
分散レポジトリ型のココが良い
さて、分散レポジトリ型の概念を上で説明しましたが、単一レポジトリ型と比 較してどんな点が良いのでしょうか? 分散レポジトリを使うと今までに出来なかったことが出来るようになります。 それは大きく二つに分類できます。
- 自分のレポジトリを持てることに起因すること
- レポジトリが持ち運べることに起因すること
まず前者ですが、自分のレポジトリを持てるということは、他の人には見せな い自分だけの履歴管理が出来るということです。ちょっと人には見せられない Dirty Hack なんかも、しっかり履歴管理出来ちゃいます。
もっとありそうなシチュエーションでは、自分がコミット権が無いプロジェク トへの Hack を管理できるという利点があります。 誰もが多くのオープンソースプロジェクトのコミット権限を持っているとは限 らないのです。 良い改変であれば受け入れてもらえる可能性は高いかもしれませんが、自分の ためだけにちょっとした Hack をした場合、それは本家のレポジトリにはコミッ トできません。 自分のレポジトリになら遠慮なく出来ます。すばらしいですね。
後者ですが、分散レポジトリ型ではレポジトリがノートPCのハードディスクや USB メモリに入れて持ち運べることが多いようです。 これによりネットワークから隔絶された状態(電車の中や、喫茶店、旅行先な ど)でも、コミットできることになります。 現代の仕事にも遊びにも忙しいプログラマには嬉しいことですね。
分散レポジトリ型だとココが問題
さて、単一レポジトリ型と比較して色々と嬉しいことがある分散レポジトリ型 ですが、分散した結果難しくなったこともあります。
まず、連番のリビジョン番号が振り辛いという問題があります。 単一レポジトリ型の場合は 0.1 → 0.2 → 0.3 というように連番でリビジョン 番号を振るのが典型的でした。
しかし分散レポジトリ型では、自分がリビジョン 0.2 をコミットしている瞬間 に、他の人もその人のレポジトリに 0.2 をコミットしてしまう可能性がありま す。 その時点では問題が発覚しないのですが、レポジトリ間で変更点をマージする 際に、異なる変更に対して別のリビジョンが付いているので問題になります。 多くの分散レポジトリ型システムでは、連番のリビジョン番号ではなくハッシュ 値をリビジョン番号の代わりとして用いることで、問題の解決を図っていますが、 連番方式と比較すると多少分かり難いという点は否めません。
運用をしっかりしないと、せっかくハックしたコードがどこに行ったのかわか らなくなるという問題もあります。 いくつでも好きなだけレポジトリが作れるからといって、無闇にいくつも作っ ていては、どのレポジトリにコミットしたのか忘れてしまいます。 一人で複数のレポジトリを扱う時には、ルールを決めてどこか一箇所に My マ スタレポジトリを置くと良いでしょう。
まとめ
単一レポジトリ型は中央集権のレポジトリを一つだけ持つ。 分散レポジトリ型はレポジトリが複数あり、各人が所有する。
分散レポジトリ型でも単一レポジトリ型と同じような運用が出来る。
分散レポジトリ型の利点は以下。
- 自分のレポジトリが持てる
- オレオレ Hack のオレオレコミット
- マスタレポジトリへのコミット権限が無い場合のオレオレコミット
- レポジトリが持ち運べる
- どこでもハック
分散レポジトリの問題は以下。
- リビジョン番号が分かり辛い。
- レポジトリが多すぎてどこにコミットしたか分からなくなる。
Keyword(s):[Git] [分散レポジトリ]
References:[SideMenu] [Git]