「バージョンコントロールシステムの比較」の版間の差分

提供: tknotebook
移動: 案内検索
(リポジトリの歴史)
(スナップショット)
40行: 40行:
  
 
スナップショットの実態は、隣の世代のスナップショットとの差分情報やファイルへのポインタ情報を中心にした小さなものであることが多いため、Mercurial のように
 
スナップショットの実態は、隣の世代のスナップショットとの差分情報やファイルへのポインタ情報を中心にした小さなものであることが多いため、Mercurial のように
まるで変更履歴のように言うこともありますが、
+
まるで変更履歴のように言うこともあります。しかし、
'''スナップショットとは、その実装という観点では、リポジトリに含まれる、ある時点での全てのファイルとディレクトリを復元するのに必要な情報にたどり着くための全情報のこと'''です。
+
'''スナップショットとは、その実装という観点では、リポジトリに含まれる、ある時点での全てのファイルとディレクトリを復元するのに必要な情報にたどり着くための情報のこと'''です。
  
 
'''スナップショットとは論理的にはある時点での全てのファイルとディレクトリの状態+αとと考えてよいものです。'''
 
'''スナップショットとは論理的にはある時点での全てのファイルとディレクトリの状態+αとと考えてよいものです。'''

2016年11月7日 (月) 08:52時点における版

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

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

ご注意ください!!!

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

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

リポジトリ

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

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

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

VCSのリポジトリの図.png

スナップショット

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

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

スナップショットは

  • Subversion では リビジョン
  • Git では スナップショットコミット
  • Mercurial ではコミットチェンジセット

と呼ばれます。

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

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

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

リポジトリの歴史

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

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

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


VCS リポジトリの歴史.png


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

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

図ではスナップショットAは開始のスナップショットを、スナップショットBはスナップショットAを修正して作られたものです。 矢印のバルーンコメントにどのような修正が有ったか書いてあります。この情報ももちろんとても有用な情報ですが、最も肝心な歴史の情報は、どのスナップショットがどのスナップショットから作られたかということです。これが歴史全体の構造を決めます。

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

スナップショットEのように、2つのスナップショットを元に作られるスナップショットもあります。これをこのドキュメントでは 「マージ」と呼ぶことにします。マージとは2つのスナップショットを分岐点まで遡ってそれぞれのそれまでの修正を把握し、両方の修正を反映するように作ったスナップショットのことです。

スナップショットの作成は人手によるものですが、マージも例外ではありません。 マージの作成は、その大部分は VCS が自動的に行います。しかし、必ずしも全てを自動的に行えるものではなく、 時に両立しない修正を選んだり、新たにコードを編集しなおしたりしてコードの整合性を保つ人による作業が必要になることが あります。

既にお分かりかと思いますが、スナップショットを結ぶ矢印の方向は過去(修正前)への方向になっています。 これには大きな意味はありません。GitというVCSが最近のスナップショットから過去に向かって歴史をさかのぼれるように リポジトリが作られているので、それを図に採用したに過ぎません。

このドキュメントでは、Gitに敬意を表し、この矢印の方向(過去方向)を採用することにします。