Daniel Barkalow
20 years ago
committed by
Junio C Hamano
1 changed files with 92 additions and 0 deletions
@ -0,0 +1,92 @@
@@ -0,0 +1,92 @@
|
||||
Trivial merge rules |
||||
=================== |
||||
|
||||
This document describes the outcomes of the trivial merge logic in read-tree. |
||||
|
||||
One-way merge |
||||
------------- |
||||
|
||||
This replaces the index with a different tree, keeping the stat info |
||||
for entries that don't change, and allowing -u to make the minimum |
||||
required changes to the working tree to have it match. |
||||
|
||||
index tree result |
||||
----------------------- |
||||
* (empty) (empty) |
||||
(empty) tree tree |
||||
index+ tree tree |
||||
index+ index index+ |
||||
|
||||
Two-way merge |
||||
------------- |
||||
|
||||
|
||||
|
||||
Three-way merge |
||||
--------------- |
||||
|
||||
It is permitted for the index to lack an entry; this does not prevent |
||||
any case from applying. |
||||
|
||||
If the index exists, it is an error for it not to match either the |
||||
head or (if the merge is trivial) the result. |
||||
|
||||
If multiple cases apply, the one used is listed first. |
||||
|
||||
A result of "no merge" means that index is left in stage 0, ancest in |
||||
stage 1, head in stage 2, and remote in stage 3 (if any of these are |
||||
empty, no entry is left for that stage). Otherwise, the given entry is |
||||
left in stage 0, and there are no other entries. |
||||
|
||||
A result of "no merge" is an error if the index is not empty and not |
||||
up-to-date. |
||||
|
||||
*empty* means that the tree must not have a directory-file conflict |
||||
with the entry. |
||||
|
||||
For multiple ancestors or remotes, a '+' means that this case applies |
||||
even if only one ancestor or remote fits; normally, all of the |
||||
ancestors or remotes must be the same. |
||||
|
||||
case ancest head remote result |
||||
---------------------------------------- |
||||
1 (empty)+ (empty) (empty) (empty) |
||||
2ALT (empty)+ *empty* remote remote |
||||
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 |
||||
8ALT ancest (empty) ancest (empty) |
||||
7 ancest+ (empty) remote no merge |
||||
9 ancest+ head (empty) no merge |
||||
10ALT ancest ancest (empty) (empty) |
||||
11 ancest+ head remote no merge |
||||
16 anc1/anc2 anc1 anc2 no merge |
||||
13 ancest+ head ancest head |
||||
14 ancest+ ancest remote remote |
||||
14ALT ancest+ ancest remote remote |
||||
|
||||
Only #2ALT and #3ALT use *empty*, because these are the only cases |
||||
where there can be conflicts that didn't exist before. Note that we |
||||
allow directory-file conflicts between things in different stages |
||||
after the trivial merge. |
||||
|
||||
A possible alternative for #6 is (empty), which would make it like |
||||
#1. This is not used, due to the likelihood that it arises due to |
||||
moving the file to multiple different locations or moving and deleting |
||||
it in different branches. |
||||
|
||||
Case #1 is included for completeness, and also in case we decide to |
||||
put on '+' markings; any path that is never mentioned at all isn't |
||||
handled. |
||||
|
||||
Note that #16 is when both #13 and #14 apply; in this case, we refuse |
||||
the trivial merge, because we can't tell from this data which is |
||||
right. This is a case of a reverted patch (in some direction, maybe |
||||
multiple times), and the right answer depends on looking at crossings |
||||
of history or common ancestors of the ancestors. |
||||
|
||||
The status as of Sep 5 is that multiple remotes are not supported |
Loading…
Reference in new issue