Merge branch 'jc/maint-checkout-keep-remove'
* jc/maint-checkout-keep-remove: checkout: do not lose staged removal
This commit is contained in:
commit
578421fbd8
@ -160,7 +160,10 @@ Here are the "carry forward" rules:
|
|||||||
0 nothing nothing nothing (does not happen)
|
0 nothing nothing nothing (does not happen)
|
||||||
1 nothing nothing exists use M
|
1 nothing nothing exists use M
|
||||||
2 nothing exists nothing remove path from index
|
2 nothing exists nothing remove path from index
|
||||||
3 nothing exists exists use M
|
3 nothing exists exists, use M if "initial checkout"
|
||||||
|
H == M keep index otherwise
|
||||||
|
exists fail
|
||||||
|
H != M
|
||||||
|
|
||||||
clean I==H I==M
|
clean I==H I==M
|
||||||
------------------
|
------------------
|
||||||
@ -207,6 +210,12 @@ you picked it up via e-mail in a patch form), `git diff-index
|
|||||||
merge, but it would not show in `git diff-index --cached $M`
|
merge, but it would not show in `git diff-index --cached $M`
|
||||||
output after two-tree merge.
|
output after two-tree merge.
|
||||||
|
|
||||||
|
Case #3 is slightly tricky and needs explanation. The result from this
|
||||||
|
rule logically should be to remove the path if the user staged the removal
|
||||||
|
of the path and then swiching to a new branch. That however will prevent
|
||||||
|
the initial checkout from happening, so the rule is modified to use M (new
|
||||||
|
tree) only when the contents of the index is empty. Otherwise the removal
|
||||||
|
of the path is kept as long as $H and $M are the same.
|
||||||
|
|
||||||
3-Way Merge
|
3-Way Merge
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
@ -269,6 +269,8 @@ static int merge_working_tree(struct checkout_opts *opts,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 2-way merge to the new branch */
|
/* 2-way merge to the new branch */
|
||||||
|
topts.initial_checkout = (!active_nr &&
|
||||||
|
(old->commit == new->commit));
|
||||||
topts.update = 1;
|
topts.update = 1;
|
||||||
topts.merge = 1;
|
topts.merge = 1;
|
||||||
topts.gently = opts->merge;
|
topts.gently = opts->merge;
|
||||||
|
@ -206,6 +206,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
opts.fn = twoway_merge;
|
opts.fn = twoway_merge;
|
||||||
|
opts.initial_checkout = !active_nr;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
default:
|
default:
|
||||||
|
@ -941,8 +941,17 @@ int twoway_merge(struct cache_entry **src, struct unpack_trees_options *o)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (newtree)
|
else if (newtree) {
|
||||||
|
if (oldtree && !o->initial_checkout) {
|
||||||
|
/*
|
||||||
|
* deletion of the path was staged;
|
||||||
|
*/
|
||||||
|
if (same(oldtree, newtree))
|
||||||
|
return 1;
|
||||||
|
return reject_merge(oldtree, o);
|
||||||
|
}
|
||||||
return merged_entry(newtree, current, o);
|
return merged_entry(newtree, current, o);
|
||||||
|
}
|
||||||
return deleted_entry(oldtree, current, o);
|
return deleted_entry(oldtree, current, o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ struct unpack_trees_options {
|
|||||||
verbose_update:1,
|
verbose_update:1,
|
||||||
aggressive:1,
|
aggressive:1,
|
||||||
skip_unmerged:1,
|
skip_unmerged:1,
|
||||||
|
initial_checkout:1,
|
||||||
gently:1;
|
gently:1;
|
||||||
const char *prefix;
|
const char *prefix;
|
||||||
int pos;
|
int pos;
|
||||||
|
Loading…
Reference in New Issue
Block a user