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

バージョン管理システムにおけるマージとは、バージョン管理されているファイル群に対して行われた変更を統合する操作のことである。マージが必要とされる典型的なケースとしては、ひとつのファイルが、異なるコンピュータ上で、異なる利用者によって同時に変更された場合がある。2つのブランチをマージすると、双方のチェンジセットを取り込んだファイル群ができあがる。

ファイルに対する変更の衝突がなければ、マージを自動的に実行することもできる。衝突があった場合は、マージ結果のファイルの作成は人手で行う必要がある。多くのバージョン管理システムにはマージ機能が搭載されている。

マージの種別

自動マージツールによって行われるマージ処理には、大きく分けて2ウェイマージと3ウェイマージがある。2ウェイマージよりも3ウェイマージの方がより強力で信頼性も高い。

2ウェイマージ

2ウェイマージでは、ファイルAとファイルBの間で差分の分析を行う。この手法では、マージの前に2つのファイルの差分を個別に検討し、その上でもっとも妥当な推測に基づく分析を行って、マージのファイルを生成する。その結果、多くの場合2ウェイマージはエラーが発生しやすく、マージを完了に先立って、ユーザによるマージ結果の確認や、場合によってはマージ結果の修正が必要となることもある。

3ウェイマージ

3ウェイマージは、ファイル'A'と'B'の差分、およびそれらの親にあたるファイル'C'（多くの場合、ファイル'A'と'B'は共通の親を持つ）との差分の分析結果を元に行われる。バージョン管理システムでは親にあたるファイルが必ず存在し、またどのファイルが親かもはっきりしているため、3ウェイマージの使用に適している。マージ用ツールは各ファイル間の差分およびその中に現れるパターンを調査し、マージを行うためにファイル'A','B','C'の間の関係モデルを生成した上で、新しいリビジョン’D'を作り出す。

3ウェイマージは信頼性が高く、実際のデータを対象にしても上手く動作する。ユーザによる最低限の介入を要する場合もあるが、（マージの複雑さにもよるが）多くの場合はユーザの操作なしにマージが行われるため、処理の自動化を目指す場合には良い選択肢となる。

傾向

3ウェイマージにおける技術の進歩により、ソフトウェア構成管理作業において、ブランチを切った上で同時並行して変更を行うという開発スタイルがソフトウェアの開発環境において次第に一般的になっていった。1990年代前半から中頃は、小規模なソフトウェア開発チームではこのような開発スタイルは避けるべきものとされていた。これは、マージ作業の複雑さ、マージによるコンフリクトの発生、費用効果の高い3ウェイマージツールが手に入りにくかったことなどに起因する。一方、大規模なソフトウェア開発チームではこのような開発スタイルの需要が増加していた。これは、複数の開発者が同時刻に同じファイルを変更するという状況が発生しやすくなっていたことに起因する。この時代においては、マージは実際困難を伴う作業であった。そのため、マージ作業の単純化のために、プログラムの所有権に関する取り決めを行うようなケースもあった。

2000年代の初め頃には3ウェイマージツールが手に入りやすくなった。これにより、開発環境における技術的制約を考慮する必要性が低下し、小規模なソフトウェア開発チームでもバージョン管理システム上で同時並行して変更を行いたいという傾向が強まることになった。しかしながら、マージ処理により問題が発生するケースもあった。この時期には、インテリジェントなマージツールであってもすべてのコンフリクトを自動で解決するのは難しかったため、手作業を排除できず、これがヒューマンエラーの元となっていた。

多くのソフトウェア開発チームにおいて、現在でも3ウェイマージは非常に負荷の高い作業である。これは特に、マージ作業の担当者に、元々のコード・途中のコミット内容・期待される修正結果といった点に対する深い理解が要求されるためである。

近年の動向
近年では、以下に挙げるような新しいマージアルゴリズムが開発され、使用頻度が高まっている。

 Darcsのパッチ順序入れ替え機能
 Codevilleのヒストリを利用した2ウェイマージ

スタンドアロンなマージツール
 Apple FileMerge NeXTのMerge由来のMac OS X用開発ツール。
 Araxis Merge 2ウェイおよび3ウェイのファイル比較、マージ、フォルダ同期が行える。WindowsおよびMac OS Xで動作する。日本語対応。
 Beyond Compare Professional フォルダとファイルの比較・同期と、3ウェイマージが行える。Mac OS X, Windows, Linuxで動作する。
 Compare++ 高機能なソースコード用diffユーティリティで、 C/C++, Java, C#, Javascript, CSSなどのソースコードに対して構造化された比較とマージが行える。
 DeltaWalker Oro ファイル及びフォルダの比較、マージ、同期が2ウェイト3ウェイの両方で実行出来る。Mac OS X, Windows, Linuxで動作する。
 DiffMerge - SourceGear
 ECMerge テキスト、画像、ディレクトリに対する2ウェイおよび3ウェイのdiffとマージが行える。
 ExamDiff Pro ディレクトリ、バイナリファイル、テキストファイルの比較が行える。
 Guiffy SureMerge ファイル比較、フォルダ比較およびマージが行える。Mac OS X, Windows, Linuxで動作する。
 KDiff3 3ウェイマージツール。
 MergePlant 3ウェイマージツール。
 SimMerge Simulinkモデル用の3ウェイマージツール。
 SourceGear DiffMerge ファイルとフォルダの比較およびマージ用ツール。3ウェイマージも行える。Mac OS X, Windows, Linuxで動作する。
 TortoiseMerge
 UltraEdit UltraCompare 
 WinMerge フリーでオープンソースな、グラフィカルなWindows用diffおよびマージツール。
 diff3 各種Unixライクなシステムで使用できる3ウェイマージツール。
 medini unite MatlabのSimulinkとStateflowモデル用の3ウェイdiffとマージ用ツール。
 meld
 tkmerge
 xxdiff グラフィカルなファイルとディレクトリの比較およびマージツール。

注釈

関連項目
 ファイル比較ツールの比較

外部リンク
 Simple way to understand 3-Way merge process

 3-way-merging Review of several popular Merge tools from various manufacturers

バージョン管理