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

バージョン管理システムにおけるマージとは、バージョン管理されているファイル群に対して行われた変更を統合する操作のことである。マージが必要とされる典型的なケースとしては、ひとつのファイルが、異なるコンピュータ上で、異なる利用者によって同時に変更された場合がある。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ウェイマージは非常に負荷の高い作業である。これは特に、マージ作業の担当者に、元々のコード・途中のコミット内容・期待される修正結果といった点に対する深い理解が要求されるためである。
近年の動向.
近年では、以下に挙げるような新しいマージアルゴリズムが開発され、使用頻度が高まっている。