You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.1 KiB
121 lines
4.1 KiB
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. |
|
|
|
Entries marked '+' have stat information. Spaces marked '*' don't |
|
affect the result. |
|
|
|
index tree result |
|
----------------------- |
|
* (empty) (empty) |
|
(empty) tree tree |
|
index+ tree tree |
|
index+ index index+ |
|
|
|
Two-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 old |
|
or the result. |
|
|
|
If multiple cases apply, the one used is listed first. |
|
|
|
A result which changes the index is an error if the index is not empty |
|
and not up-to-date. |
|
|
|
Entries marked '+' have stat information. Spaces marked '*' don't |
|
affect the result. |
|
|
|
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 |
|
--------------- |
|
|
|
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, a '+' means that this case applies even if |
|
only one ancestor or remote fits; a '^' means all of the ancestors |
|
must be the same. |
|
|
|
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 |
|
|
|
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. |
|
|
|
Note that, between #6, #7, #9, and #11, all cases not otherwise |
|
covered are handled in this table. |
|
|
|
For #8 and #10, there is alternative behavior, not currently |
|
implemented, where the result is (empty). As currently implemented, |
|
the automatic merge will generally give this effect.
|
|
|