「バージョンコントロールシステムの比較」の版間の差分
(→リポジトリの歴史) |
(→リポジトリの歴史) |
||
49行: | 49行: | ||
スナップショットに歴史があるので、われわれはVCSのなかから目的のスナップショットを選ぶことができるのです。 | スナップショットに歴史があるので、われわれはVCSのなかから目的のスナップショットを選ぶことができるのです。 | ||
− | スナップショットの歴史とは、どのスナップショットを元に、次のスナップショットが作られていったかを示す一連の情報です。 | + | '''スナップショットの歴史とは、どのスナップショットを元に、次のスナップショットが作られていったかを示す一連の情報です。''' |
60行: | 60行: | ||
図ではスナップショットAは開始のスナップショットを、スナップショットBはスナップショットAを修正して作られたものです。 | 図ではスナップショットAは開始のスナップショットを、スナップショットBはスナップショットAを修正して作られたものです。 | ||
+ | 矢印のバルーンコメントにどのような修正が有ったか書いてあります。この情報ももちろんとても有用な情報ですが、最も肝心な歴史の情報は、どのスナップショットがどのスナップショットから作られたかということです。これが歴史全体の構造を決めます。 | ||
スナップショットCとDのように、同じスナップショットを修正して作られるものもあります。 | スナップショットCとDのように、同じスナップショットを修正して作られるものもあります。 | ||
− | このように枝分かれすることを、このドキュメントでは'''「分岐」'''と呼ぶことにしましょう。 | + | このように枝分かれすることを、このドキュメントでは'''「分岐」'''と、分岐する際の起点となるスナップショットを |
+ | '''「分岐点」'''と呼ぶことにしましょう。 | ||
スナップショットEのように、2つのスナップショットを元に作られるスナップショットもあります。これをこのドキュメントでは | スナップショットEのように、2つのスナップショットを元に作られるスナップショットもあります。これをこのドキュメントでは | ||
− | + | '''「マージ」'''と呼ぶことにします。マージとは2つのスナップショットを分岐点まで遡ってそれぞれのそれまでの修正を把握し、両方の修正を反映するように作ったスナップショットのことです。 | |
− | + | ||
− | '''マージ''' | + | スナップショットの作成は人手によるものですが、'''マージ'''も例外ではありません。 |
+ | '''マージ'''の作成は、その大部分は VCS が自動的に行います。しかし、必ずしも全てを自動的に行えるものではなく、 | ||
+ | 時に両立しない修正を選んだり、新たにコードを編集しなおしたりしてコードの整合性を保つ人による作業が必要になることが | ||
+ | あります。 | ||
− | 既にお分かりかと思いますが、スナップショットを結ぶ'''矢印の方向は過去'''への方向になっています。 | + | 既にお分かりかと思いますが、スナップショットを結ぶ'''矢印の方向は過去(修正前)'''への方向になっています。 |
これには大きな意味はありません。GitというVCSが最近のスナップショットから過去に向かって歴史をさかのぼれるように | これには大きな意味はありません。GitというVCSが最近のスナップショットから過去に向かって歴史をさかのぼれるように | ||
− | + | リポジトリが作られているので、それを図に採用したに過ぎません。 | |
このドキュメントでは、Gitに敬意を表し、この矢印の方向(過去方向)を採用することにします。 | このドキュメントでは、Gitに敬意を表し、この矢印の方向(過去方向)を採用することにします。 |
2016年11月7日 (月) 02:41時点における版
このページはまだ正式に公開されていない下書きです。
まだ、間違いや嘘がたくさん混じっているはずです。
ご注意ください!!!
バージョンコントロールシステム(VCS)の基本
まずここではバージョンコントロールシステム(以降VCS)の基本的な考え方と用語について解説します。
リポジトリ
VCSは様々なファイルやディレクトリをひとまとめにしてそのバージョンを管理します。 このひとまとめにしたファイルやディレクトリなどの内容を集めたものをリポジトリといいます。
単にファイルやディレクトリを集めただけでは、それは単なるファイルシステムですが、 リポジトリの中のファイルやディレクトリには「歴史」が含まれており、 ファイルやディレクトリがいつ誰によって作られ、どのように変更されて行ったかが全て保存されています。
リポジトリの中には様々な時点のファイルやディレクトリの状態が、何らかの方法で全て保存されており、 ファイルやディレクトリを任意の時点の状態に復元することが可能です。
スナップショット
VCS はリポジトリにファイルやディレクトリの様々な時点の「状態」を再現することができますが、 特定の時点のファイルやディレクトリの状態のことを、ここでは「スナップショット」 と呼ぶことにします。
「スナップショット」にはファイルやディレクトリの状態の他に、スナップショットを登録した人や登録日時 など様々な情報が追加されています。
スナップショットは Subversion では リビジョン、Git では スナップショットやコミット、Mercurial ではコミットやチェンジログと呼ばれます。
スナップショットの実態は、隣の世代のスナップショットとの差分情報を中心にした小さなものが多いため、Mercurial のように まるで変更履歴のように言うこともありますが、 スナップショットとは、その実装という観点では、リポジトリに含まれる、ある時点での全てのファイルとディレクトリを復元するのに必要な情報にたどり着くための全情報のことです。
スナップショットとは論理的にはある時点での全てのファイルとディレクトリの状態+αとと考えてよいものです。 つまり、「スナップショット」という言葉通り、フォルダとファイルのある時点での状態を切り取ったスナップ写真です。
Tip: Mercurial はフォルダ情報を保持しないため、空のフォルダは再現できず消えてしまいます。
リポジトリの歴史
リポジトリはスナップショットの集合体ですが、それだけでは VCS としてあまり役に立ちません。
我々が VCS を使うのはスナップショットの歴史をリポジトリに刻み、またスナップショットの歴史を辿りたいからです。 スナップショットに歴史があるので、われわれはVCSのなかから目的のスナップショットを選ぶことができるのです。
スナップショットの歴史とは、どのスナップショットを元に、次のスナップショットが作られていったかを示す一連の情報です。
上図はリポジトリの歴史を模式的に表したものです。図中の丸はひとつのスナップショットを表しています。
左端の「開始」とかかれたスナップショットは、リポジトリに最初に登録されたスナップショットです。利用者はこのスナップショットをベースにファイルやディレクトリを修正/追加/削除して次々に新しいスナップショットを作成してリポジトリに登録してゆきます。
図ではスナップショットAは開始のスナップショットを、スナップショットBはスナップショットAを修正して作られたものです。 矢印のバルーンコメントにどのような修正が有ったか書いてあります。この情報ももちろんとても有用な情報ですが、最も肝心な歴史の情報は、どのスナップショットがどのスナップショットから作られたかということです。これが歴史全体の構造を決めます。
スナップショットCとDのように、同じスナップショットを修正して作られるものもあります。 このように枝分かれすることを、このドキュメントでは「分岐」と、分岐する際の起点となるスナップショットを 「分岐点」と呼ぶことにしましょう。
スナップショットEのように、2つのスナップショットを元に作られるスナップショットもあります。これをこのドキュメントでは 「マージ」と呼ぶことにします。マージとは2つのスナップショットを分岐点まで遡ってそれぞれのそれまでの修正を把握し、両方の修正を反映するように作ったスナップショットのことです。
スナップショットの作成は人手によるものですが、マージも例外ではありません。 マージの作成は、その大部分は VCS が自動的に行います。しかし、必ずしも全てを自動的に行えるものではなく、 時に両立しない修正を選んだり、新たにコードを編集しなおしたりしてコードの整合性を保つ人による作業が必要になることが あります。
既にお分かりかと思いますが、スナップショットを結ぶ矢印の方向は過去(修正前)への方向になっています。 これには大きな意味はありません。GitというVCSが最近のスナップショットから過去に向かって歴史をさかのぼれるように リポジトリが作られているので、それを図に採用したに過ぎません。
このドキュメントでは、Gitに敬意を表し、この矢印の方向(過去方向)を採用することにします。