このドキュメントでは、read-tree でのtrivial(些細な)マージロジックの結果について説明します。

One-way merge

これにより、インデックスが別のツリーに置き換えられ、そして、変更されないエントリの統計情報は保持され、そして -u は作業ツリーに必要最小限の変更を加えてインデックスと一致させることができます。

+ とマークされたエントリには、統計情報があります。 * とマークされた空白欄は結果に影響しません。

index   tree    result
-----------------------
*       (empty) (empty)
(empty) tree    tree
index+  tree    tree
index+  index   index+

Two-way merge

インデックスにエントリがないことは許可されています。 これにより、任意のケースの適用が妨げられることはありません。

インデックスが存在する場合、古いものと結果のどちらとも一致しないのはエラーです。

複数のケースが当てはまる場合は、使用されたケースが最初にリストされます。

インデックスが空でなく、最新でない場合、インデックスを変更する結果はエラーになります。

+ とマークされたエントリには、統計情報があります。 * とマークされた空白欄は結果に影響しません。

case  index   old     new     result
-------------------------------------
0/2   (empty) *       (empty) (empty)
1/3   (empty) *       new     new
4/5   index+  (empty) (empty) index+
6/7   index+  (empty) index   index+
10    index+  index   (empty) (empty)
14/15 index+  old     old     index+
18/19 index+  old     index   index+
20    index+  index   new     new

Three-way merge

インデックスにエントリがないことは許可されています。 これにより、任意のケースの適用が妨げられることはありません。

インデックスが存在する場合、ヘッドまたは、(マージがtrivial(些細な)の場合は)結果のいずれとも一致しないのはエラーです。

複数のケースが当てはまる場合は、使用されたケースが最初にリストされます。

「no merge」(マージなし)の結果は、インデックスがステージ0に残され、かつ、祖先がステージ1に、かつ、ヘッドがステージ2に、かつ、リモートがステージ3に残されることを意味します(これらのいずれかが空の場合、そのステージのエントリは残されません)。 それ以外の場合、指定されたエントリはステージ0に残され、他のエントリはありません。

インデックスが空でなく、最新でない場合、「no merge」(マージなし)の結果はエラーになります。

*empty* は、ツリーに、エントリとディレクトリファイルの競合があっては ならないことを意味します。

複数の祖先の場合、 + は、1つの祖先またはリモートが適合する場合でもこのケースが適用されることを意味します。 ^ は、すべての祖先が同じでなければならないことを意味します。

case  ancest    head    remote    result
----------------------------------------
1     (empty)+  (empty) (empty)   (empty)
2ALT  (empty)+  *empty* remote    remote
2     (empty)^  (empty) remote    no merge
3ALT  (empty)+  head    *empty*   head
3     (empty)^  head    (empty)   no merge
4     (empty)^  head    remote    no merge
5ALT  *         head    head      head
6     ancest+   (empty) (empty)   no merge
8     ancest^   (empty) ancest    no merge
7     ancest+   (empty) remote    no merge
10    ancest^   ancest  (empty)   no merge
9     ancest+   head    (empty)   no merge
16    anc1/anc2 anc1    anc2      no merge
13    ancest+   head    ancest    head
14    ancest+   ancest  remote    remote
11    ancest+   head    remote    no merge

#2ALT と #3ALT のみが *empty* を使用します。これは、これらが以前には存在しなかった競合が発生する可能性がある唯一のケースであるためです。 注意: trivial(些細な)マージの後、さまざまな段階でディレクトリとファイルの競合が発生する可能性があることに注意してください。

#6 の可能な代替案は (empty) で、これは #1 のようになります。 これは、ファイルを複数の異なる場所に移動したり、異なるブランチでファイルを移動および削除したりすることで発生する可能性があるため、使用されません。

完全を期すために、また + マークを付けることにした場合に備えて、ケース #1 が含まれています。 まったく言及されていないパスは処理されません。

注意: #16 は、 #13 と #14 の両方が適用される場合であることに注意してください。 この場合、このデータからはどちらが正しいかわからないため、trivial(些細な)マージを拒否します。 これは、元に戻したパッチ(reverted patch)(いくつかの方向、場合によっては複数回)の場合であり、正しい答えは、履歴の交差または祖先の共通の祖先を調べることに依存します。

注意: #6 と #7 と #9 と #11 の間では、他でカバーされていないすべてのケースがこの表で処理されることに注意してください。

#8 と #10 には、現在実装されていない代替動作があり、結果は (empty) になります。 現在の実装では、自動マージは通常この効果をもたらします。