kledgeb Ubuntuの使い方や日本語化、アプリの使い方を紹介しています。

マージストラテジー(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」ブランチの変更内容をマージしています。

    このようなマージでは、複数の「親コミットオブジェクト」が「マージベース」の候補に上がります。

    「マージベース」の選択は、「マージストラテジー」によって変わります。

  Resolveに指定できるオプション

    「マージストラテジー」に「Resolve」を指定した場合、「マージストラテジー」のオプションは利用できません。

  Resolveによるマージの例

    「Resolveマージストラテジー」を利用したマージの例は、「Resolveマージストラテジーでマージを行う」を参考にしてください。


関連コンテンツ
同一カテゴリーの記事
コメント
オプション