Fix missing symbol explanations, a few incorrect cases, and add two-way merge rules. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
		
			
				
	
	
		
			122 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.1 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.
 |