バージョンコントロールシステムの比較

提供: tknotebook
2016年11月7日 (月) 02:15時点におけるNakamuri (トーク | 投稿記録)による版

移動: 案内検索

このページはまだ正式に公開されていない下書きです。

まだ、間違いや嘘がたくさん混じっているはずです。

ご注意ください!!!

バージョンコントロールシステム(VCS)の基本

まずここではバージョンコントロールシステム(以降VCS)の基本的な考え方と用語について解説します。

リポジトリ

VCSは様々なファイルやディレクトリをひとまとめにしてそのバージョンを管理します。 このひとまとめにしたファイルやディレクトリなどの内容を集めたものをリポジトリといいます。

単にファイルやディレクトリを集めただけでは、それは単なるファイルシステムですが、 リポジトリの中のファイルやディレクトリには「歴史」が含まれており、 ファイルやディレクトリがいつ誰によって作られ、どのように変更されて行ったかが全て保存されています。

リポジトリの中には様々な時点のファイルやディレクトリの状態が、何らかの方法で全て保存されており、 ファイルやディレクトリを任意の時点の状態に復元することが可能です。

VCSのリポジトリの図.png

スナップショット

VCS はリポジトリにファイルやディレクトリの様々な時点の「状態」を再現することができますが、 特定の時点のファイルやディレクトリの状態のことを、ここでは「スナップショット」 と呼ぶことにします。

「スナップショット」にはファイルやディレクトリの状態の他に、スナップショットを登録した人や登録日時 など様々な情報が追加されています。

スナップショットは Subversion では リビジョン、Git では スナップショットコミット、Mercurial ではコミットチェンジログと呼ばれます。

スナップショットの実態は、隣の世代のスナップショットとの差分情報を中心にした小さなものが多いため、Mercurial のように まるで変更履歴のように言うこともありますが、 スナップショットとは、その実装という観点では、リポジトリに含まれる、ある時点での全てのファイルとディレクトリを復元するのに必要な情報にたどり着くための全情報のことです。

スナップショットとは論理的にはある時点での全てのファイルとディレクトリの状態+αとと考えてよいものです。 つまり、「スナップショット」という言葉通り、フォルダとファイルのある時点での状態を切り取ったスナップ写真です。

Tip: Mercurial はフォルダ情報を保持しないため、空のフォルダは再現できず消えてしまいます。

リポジトリの歴史

スナップショットはある時点でのファイルやディレクトリの全情報を含むので、それぞれのスナップショットは 独立に使えるものです。

リポジトリはスナップショットの集合体ですが、それだけでは VCS としてあまり役に立ちません。

我々が VCS を使うのはスナップショットの歴史を刻み、またスナップショットの歴史を覗きたいからです。 スナップショットに歴史があるので、われわれはVCSのなかから目的のスナップショットを選ぶことができます。

スナップショットの歴史とは、どのスナップショットを元に、次のスナップショットが作られていったかを示す一連の情報です。


VCS リポジトリの歴史.png


上図はリポジトリの歴史を模式的に表したものです。図中の丸はひとつのスナップショットを表しています。

左端の「開始」とかかれたスナップショットは、リポジトリに最初に登録されたスナップショットです。利用者はこのスナップショットをベースにファイルやディレクトリを修正/追加/削除して次々に新しいスナップショットを作成してリポジトリに登録してゆきます。

図ではスナップショットAは開始のスナップショットを、スナップショットBはスナップショットAを修正して作られたものです。

スナップショットCとDのように、同じスナップショットを修正して作られるものもあります。 このように枝分かれすることを、このドキュメントでは「分岐」と呼ぶことにしましょう。

既にお分かりかと思いますが、スナップショットを結ぶ矢印の方向は過去への方向になっています。 これには大きな意味はありませんが、多くのVCSでは最近作られたものから過去に向かって歴史をさかのぼれるように 作られているのでこの表し方にしてみました。

このドキュメントでは、この歴史の矢印の方向(過去方向)を採用します。