分散型のバージョンコントロールシステムでは、カレントのブランチに他のブランチの変更をマージします。
集中型のバージョンコントロールシステムでは、カレントVCファイルセットに他のブランチの変更をマージします。
ブランチで開発している場合、すでに他のブランチで行われた変更をマージ(merge)する必要があるときがあります。これは2つのブランチでの変更が重なっていたり競合する場合もあるため、些細な操作とはいえません。
分散型のバージョンコントロールシステムでは、コマンドC-x v m
(vc-merge
)でマージします。Bazaarでは、これはコマンドbzr
merge
に渡す正確な引数の入力を求めます。そのとき、可能であれば目的にかなったデフォルトを提示します。Gitでは、これはマージするブランチ名の入力を求めます。このとき、(カレントレポジトリが知っているブランチ名にもとづく)補完を行います。Mercurialではhg
merge
に渡す引数の入力を求めます。マージコマンドの実行による出力は、他のバッファーに表示されます。
CVSのような集中型のバージョンコントロールシステムでは、C-x v mはブランチID、または2つのリビジョンIDの入力を求めます。コマンドはそのブランチからの変更点、または指定した2つのリビジョン間の差分を探して、それらの変更をカレントVCファイルセットにマージします。RETだけをタイプした場合、Emacsは単にそのファイルをチェックアウトしたブランチに行われた変更をマージします。
マージを処理した直後は、作業ツリーだけが変更されており、C-x v Dおよび関連するコマンドで、マージにより生成された変更をレビューできます(古いリビジョンの調査と比較を参照してください)。2つのブランチが重なった変更をもつ場合、マージは衝突(conflict)を生成します。その場合、マージコマンドの出力には警告が現れ。影響のある作業ファイルの、衝突する2つの変更の周囲に、衝突マーカー(conflict markers)が挿入されます。衝突を解決するには、衝突するファイルを編集しなければなりません。EmacsはデフォルトではVCで衝突が生じたバッファーをSmergeという特別なモードにします。これはマージの衝突を解決するために特別なコマンドを提供するモードです。衝突を解決したファイルを保存したらマージが効果を発揮するように、通常の方法により変更したファイルをコミットしなければなりません(バージョンコントロール下での基本的な編集を参照)。