Recursive
「Recursiveマージストラテジー」は、「Resolveマージストラテジー」同様、2つのブランチをマージする時に使用できる「マージストラテジー」です。現在の「Git」では、「Recursiveマージストラテジー」によるマージがデフォルトの「マージストラテジー」です。
共通のコミットオブジェクトが1つ存在する場合
「Resolveマージストラテジー」同様、2つのブランチの共通の「親コミットオブジェクト」を「マージベース」にし、それぞれのブランチの「コミットオブジェクト」のファイル群を「3ウェイマージ」により、マージします。共通のコミットオブジェクトが複数存在する場合
「十字マージ」では、複数の共通の「親コミットオブジェクト」が存在します。この時、「Recursiveマージストラテジー」は「Resolveマージストラテジー」とは異なる動作を行います。
複数の共通の「親コミットオブジェクト」が存在する場合、まずそれらをマージします。
そのマージ結果を「マージベース」とし、それぞれのブランチの「コミットオブジェクト」のファイル群を「3ウェイマージ」により、マージします。
これによるメリットは、「マージコンフリクト」の発生量の軽減や、ユーザーの意図をマージ結果に反映させやすくなる点です。
Recursiveによるマージの例
「Recursiveマージストラテジー」を利用したマージの例は、「Recursiveマージストラテジーでマージを行う」を参考にしてください。Recursiveマージストレージオプション
「Recursiveマージストラテジー」では、以下のオプションが利用できます。マージ用途に合わせて利用するとよいでしょう。
- ours
- theirs
- patience
- diff-algorithm
- ignore-space-change
- ignore-all-space
- ignore-space-at-eol
- renormalize
- no-renormalize
- rename-threshold
- subtree
1.ours
「マージコンフリクト」に関するオプションです。このオプションを指定すると、コンフリクトが発生した差分は、常に現在のブランチ(HEAD)のファイルの差分が採用されます。
従って、コンフリクトが発生した差分は、マージするブランチの変更内容の影響を受けません。
コンフリクトが発生しなかった差分は、通常通りマージされます。
これはファイル単位ではなく、差分単位で処理されます。
このオプションの使用例は、「Recursiveマージストラテジーで、現在のファイルの差分を優先してマージする」を参考にしてください。
2.theirs
「マージコンフリクト」に関するオプションです。「ours」の反対です。
このオプションを指定すると、コンフリクトが発生した差分は、常にマージするブランチのファイルの差分が採用されます。
コンフリクトが発生しなかった差分は、通常通りマージされます。
これはファイル単位ではなく、差分単位で処理されます。
このオプションの使用例は、「Recursiveマージストラテジーで、マージするブランチのファイルの差分を優先してマージする」を参考にしてください。
3.patience
差分の生成に関するオプションです。ファイルの差分を生成する際、Patience Diffアルゴリズムで差分の生成を行います。
このオプションの使用例は、「Recursiveマージストラテジーで、Patience Diffアルゴリズムを使用してマージする」を参考にしてください。
4.diff-algorithm
差分の生成に関するオプションです。ファイルの差分を生成する際、指定されたDiffアルゴリズムで差分の生成を行います。
上記の「patience」も指定可能です。
このオプションの使用例は、「Recursiveマージストラテジーで、Diffアルゴリズムを指定してマージする」を参考にしてください。
5.ignore-space-change
差分生成時の空白文字に関するオプションです。このオプションを指定すると、行末の空白文字を無視します。
また、1文字以上の空白文字は、同じ扱いになります。
このオプションの使用例は、「Recursiveマージストラテジーで、行末の空白文字を無視し、複数の空白文字を同一文字とみなし、マージする」を参考にしてください。
6.ignore-all-space
差分生成時の空白文字に関するオプションです。このオプションを指定すると、すべての空白文字を無視してファイルの比較を行います。
このオプションの使用例は、「Recursiveマージストラテジーで、すべての空白文字を無視してマージする」を参考にしてください。
7.ignore-space-at-eol
差分生成時の空白文字に関するオプションです。このオプションを指定すると、行末の空白文字を無視してファイルの比較を行います。
このオプションの使用例は、「Recursiveマージストラテジーで、行末の空白文字を無視してマージする」を参考にしてください。
8.renormalize
このオプションを指定すると、マージするファイルを「gitattributes」で定義した属性を適用してから、マージを行います。適用される属性は、「HEAD」の「gitattributes」で定義した属性です。
マージするブランチに含まれるファイルの改行コードを揃えたい時など、フィルターを実行してからマージしたい時に利用します。
また「merge.renormalize」の設定よりも優先されます。
このオプションの使用例は、「Recursiveマージストラテジーで、gitattributesで定義した属性を適用してから、マージする」を参考にしてください。
9.no-renormalize
このオプションを指定すると、マージするファイルを「gitattributes」で定義した属性を適用せず、マージを行います。また「merge.renormalize」の設定よりも優先されます。
デフォルトでは、「gitattributes」で定義した属性は適用されません。
このオプションの使用例は、「Recursiveマージストラテジーで、gitattributesで定義した属性を適用せず、マージする」を参考にしてください。
10.rename-threshold
ファイル名が変更されたファイルの検出に関するオプションです。マージする際、ファイル名が変更されたファイルが存在するかどうかを検出します。
この検出は、差分がない箇所(変更されていない箇所)とファイルサイズとの割合で、ファイル名が変更されたかどうかを検出します。
もしあるファイルが、ファイル名が変更されたファイルだと判断された場合は、そのファイルには、ファイル名が変更される前のファイルと、変更された後のファイルの関係が作られます。
この関係は、マージ内容に反映されます。
このオプションの使用例は、「Recursiveマージストラテジーで、ファイル名変更検出のしきい値を指定して、マージする」を参考にしてください。
11.subtree
「マージストラテジー」の「Subtree」と同様のマージを行います。「マージストラテジー」の「Subtree」では、マージするブランチのファイル群が、「ワーキングディレクトリー」内のどのサブフォルダー内に配置されているかは、「Git」が自動的に判断します。
一方、この「subtree」は、ユーザーが配置先のサブフォルダーを指定することができます。
このオプションの使用例は、「Recursiveマージストラテジーで、マージするブランチのファイル群を、サブフォルダー内のファイルにマージする」を参考にしてください。
ResolveとRecursiveどちらを選ぶか
基本的にまず「Recursiveマージストラテジー」によるマージを行い、結果が思わしくなければ「Resolveマージストラテジー」を試してみるとよいでしょう。「Recursiveマージストラテジー」は、マージストレージオプションが多く用意されており、ユーザーの意図を反映したマージを行いやすくなっています。
「Recursiveマージストラテジー」は「Resolveマージストラテジー」よりも、スマートにマージを行います。
ブランチの状態にもよりますが、「マージコンフリクト」の発生やコンフリクト量の軽減、ユーザーが意図するマージ結果に期待できます。
また「Recursiveマージストラテジー」は、ファイル名の変更にも追従できます。