3ウェイマージというマージアルゴリズム
分散バージョン管理のマージコマンドが優れているのは、3ウェイマージが使われているのではないか、と思った。
3ウェイマージに関する記事をメモ。
【元ネタ】
変更をマージする ? Bazaar v2.6.0dev2 documentation
JapaneseTutorialConflict - Mercurial
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の違いは単なるツールの違いではない。
バージョン管理ツールにおける機能や設計思想が根本から異なっているのだ。
| 固定リンク
「廃止Mercurial」カテゴリの記事
- GitHubはオープンソースのプロセスを標準化した(2015.06.11)
- 「反復型ソフトウェア開発」はソフトウェア工学の良書(2013.02.09)
- Mercurialに取り込まれたコミュニティ由来の機能一覧(2013.01.12)
- WordやExcelから直接Mercurialへコミットできるアドオンmsofficehg(2012.12.07)
- RedmineでSubversion リポジトリ表示を高速化する方法(2012.11.23)
「構成管理・Git」カテゴリの記事
- 「GitLabに学ぶ 世界最先端のリモート組織のつくりかた」の感想(2023.12.10)
- パッケージ設計の原則の意義は変化しているのか(2023.09.30)
- 小説活動にプルリクエスト駆動が必要になってきた(2022.05.08)
- 【資料公開】チケット駆動開発の解説~タスク管理からプロセス改善へ #redmine(2022.01.14)
- プログラミングしてる時はでっかいピタゴラ装置を作ってるみたいな感じ(2022.01.09)
コメント