122 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
| 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.
 |