« 分散バージョン管理はバージョンではなくリビジョンを管理する | トップページ | 「はじめて学ぶソフトウェアのテスト技法」は良本 »

2012/06/19

3ウェイマージというマージアルゴリズム

分散バージョン管理のマージコマンドが優れているのは、3ウェイマージが使われているのではないか、と思った。
3ウェイマージに関する記事をメモ。

【元ネタ】
変更をマージする ? Bazaar v2.6.0dev2 documentation

JapaneseTutorialConflict - Mercurial

マージ (バージョン管理システム) - Wikipedia

競合の編集~TortoiseMerge

第3章 TortoiseMergeの使い方

Mercurial 2.0?: graft: 3-way マージアルゴリズムを使った cherry-picking - tcha.org

分散バージョン管理はバージョンではなくリビジョンを管理する: プログラマの思索

SVNからMercurialに移行するべき8つの理由: ニュースの社会科学的な裏側

(引用開始)
SVNのブランチの様にTruncとBlanchを分ける場合は、リポジトリを別に分ける事になる。SVNのブランチも有効に使っていない開発チームも少なくない。分岐バージョンはリポジトリを分けると言うのは、シンプルで分かりやすい方法だ。しかし、ブランチ間の関係を示す情報が失われるため、2-way mergeをせざるをえなくなる。GitやMercurialが使う3-way mergeに比較して、SVNの2-way mergeは衝突を起こしやすい。
(引用終了)

2-way mergeと3-way mergeの定義は、Wikipediaを見よ。
競合の編集~TortoiseMergeの説明が分かりやすい。
マージのデシジョンテーブルは、変更をマージする ? Bazaar v2.6.0dev2 documentationにそのパターンが書かれている。

SVNでは、ブランチを分岐する時にリポジトリを分けてしまう運用をしてしまいがち。
すると、ブランチの派生元が不明になるため、現行・最新ファイルの2ファイルの差分比較のため、2-way mergeをせざるを得ない。

GitやMercurialでは、リビジョン自身を管理しており、リビジョンの派生元(親リビジョン)は必ず存在している。
だから、派生元・現行・最新ファイルの3ファイルで差分比較できるから、3-way mergeを使うことができ、それがマージ作業の信頼性を高めている。

Mercurial 2.0?: graft: 3-way マージアルゴリズムを使った cherry-picking - tcha.orgによれば、hg graphコマンドによる3-way マージは、rebaseに似ている。
つまり、現行のリビジョンに対して、親リビジョンからの履歴を引き継ぎながら、合流するようにマージする。
そのおかげで、コミット履歴が理解しやすくなる。

分散バージョン管理はバージョンではなくリビジョンを管理する: プログラマの思索で書いたが、GitやMercurialはリビジョン地震を変更管理の対象とすることによって、リポジトリの同期作業やマージ作業が高速になるだけでなく、マージ作業自身の信頼性も高めている。

3-way マージツールは、ToritoseMergeやWinMergeが有名だろうが、Perforceで使われているp4Mergeも高機能らしい。

TortoiseSVNでマージする方法: プログラマの思索

TortoiseSVNの差分比較でWinMergeを使う: プログラマの思索

SVNとGitやMercurialの違いは単なるツールの違いではない。
バージョン管理ツールにおける機能や設計思想が根本から異なっているのだ。

|

« 分散バージョン管理はバージョンではなくリビジョンを管理する | トップページ | 「はじめて学ぶソフトウェアのテスト技法」は良本 »

Git・構成管理」カテゴリの記事

Mercurial」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« 分散バージョン管理はバージョンではなくリビジョンを管理する | トップページ | 「はじめて学ぶソフトウェアのテスト技法」は良本 »