-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[PATCH] Document the trivial merge rules for 3(+more ancestors)-way m…
…erges. Signed-off-by: Daniel Barkalow Signed-off-by: Junio C Hamano <junkio@cox.net>
- Loading branch information
Daniel Barkalow
authored and
Junio C Hamano
committed
Sep 11, 2005
1 parent
ee6566e
commit 3d89cb4
Showing
1 changed file
with
92 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
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. | ||
|
||
index tree result | ||
----------------------- | ||
* (empty) (empty) | ||
(empty) tree tree | ||
index+ tree tree | ||
index+ index index+ | ||
|
||
Two-way merge | ||
------------- | ||
|
||
|
||
|
||
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 or remotes, a '+' means that this case applies | ||
even if only one ancestor or remote fits; normally, all of the | ||
ancestors or remotes must be the same. | ||
|
||
case ancest head remote result | ||
---------------------------------------- | ||
1 (empty)+ (empty) (empty) (empty) | ||
2ALT (empty)+ *empty* remote remote | ||
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 | ||
8ALT ancest (empty) ancest (empty) | ||
7 ancest+ (empty) remote no merge | ||
9 ancest+ head (empty) no merge | ||
10ALT ancest ancest (empty) (empty) | ||
11 ancest+ head remote no merge | ||
16 anc1/anc2 anc1 anc2 no merge | ||
13 ancest+ head ancest head | ||
14 ancest+ ancest remote remote | ||
14ALT ancest+ ancest remote remote | ||
|
||
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. | ||
|
||
The status as of Sep 5 is that multiple remotes are not supported |