Spaces:
Running
Running
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. | |