マージストラテジー(Merge strategy)
「マージストラテジー」とは、マージのアルゴリズムのことです。「マージストラテジー」における重要なポイントは、「3ウェイマージ」実行時にどの共通の「親コミットオブジェクト」を選択するのか、という点です。
マージベース(merge base)
「マージベース」とは、「3ウェイマージ」における共通の「親コミットオブジェクト」のことです。「3ウェイマージ」では、マージするブランチに共通する「親コミットオブジェクト」を「マージベース」にします。
この「マージベース」の選択は、マージ結果に影響します。
例えば、あるブランチをマージする際、2つ以上の共通する「親コミットオブジェクト」が存在するとします。
どの「親コミットオブジェクト」を「マージベース」に選択するかで、マージ結果が変わります。
「マージコンフリクト」が発生する量や、そもそもユーザーが期待するファイルの中身になるかどうかが、「マージベース」の選択により変わってきます。
この「マージベース」の選択は、「マージストラテジー」によりアルゴリズムが変わります。
マージストラテジーの選択
マージするブランチの状態や、ブランチの構成、及びマージ対象となるブランチの数に応じて、「Git」は適切な「マージストラテジー」を選択します。「Git」は可能な限り簡潔で、コストがかからない方法を選択しようとします。
通常のマージでは、「Git」に「マージストラテジー」の選択を任せるのが良いでしょう。
しかしそれでは都合が悪い場合、ユーザーはマージに使用する「マージストラテジー」を選択することができます。
マージストラテジーの種類
「マージストラテジー」には、以下の種類があります。上記の「マージストラテジー」のうち、「Ours」と「Subtree」は、特別な状況で使用します。
Resolve
2つのブランチをマージする時に使用できる「マージストラテジー」です。以前の「Git」では、「Resolve」によるマージがデフォルトでした。
(「Recursiveマージストラテジー」は後から出てきた「マージストラテジー」)
簡潔なアルゴリズムでマージを行う
「Resolve」は、2つのブランチの共通の「親コミットオブジェクト」を「マージベース」にし、それぞれのブランチの「コミットオブジェクト」のファイル群を「3ウェイマージ」により、マージします。もし複数の共通の「コミットオブジェクト」が存在する場合、いずれか1つの「親コミットオブジェクト」が「マージベース」に選択されます。
例えば、以下のようなブランチがあるとします。
「Commit4」と「Commit5」は、「マージコミット」で生成された「コミットオブジェクト」です。
この時、「master」ブランチと「fix」ブランチをマージすると、3ウェイマージによってマージが行われます。
「マージベース」となる「親コミットオブジェクト」は、ブランチの共通の「親コミットオブジェクト」ですから、「Commit3」もしくは「Commit2」が「マージベース」になります。
十字マージ(criss-cross merge)
上記のようなお互いのブランチがお互いの変更内容をマージしている状況を、十字マージ(criss-cross merge)といいます。「master」ブランチは、「Commit5」で「fix」ブランチの変更内容をマージしています。
一方、「fix」ブランチは、「Commit4」で「master」ブランチの変更内容をマージしています。
このようなマージでは、複数の「親コミットオブジェクト」が「マージベース」の候補に上がります。
「マージベース」の選択は、「マージストラテジー」によって変わります。