| 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. |