Merge branch 'jc/maint-checkout-keep-remove' into maint
* jc/maint-checkout-keep-remove: checkout: do not lose staged removal
This commit is contained in:
commit
2ba3d5d9bd
@ -160,7 +160,10 @@ Here are the "carry forward" rules:
|
||||
0 nothing nothing nothing (does not happen)
|
||||
1 nothing nothing exists use M
|
||||
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
|
||||
------------------
|
||||
@ -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`
|
||||
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
|
||||
~~~~~~~~~~~
|
||||
|
@ -269,6 +269,8 @@ static int merge_working_tree(struct checkout_opts *opts,
|
||||
}
|
||||
|
||||
/* 2-way merge to the new branch */
|
||||
topts.initial_checkout = (!active_nr &&
|
||||
(old->commit == new->commit));
|
||||
topts.update = 1;
|
||||
topts.merge = 1;
|
||||
topts.gently = opts->merge;
|
||||
|
@ -206,6 +206,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
|
||||
break;
|
||||
case 2:
|
||||
opts.fn = twoway_merge;
|
||||
opts.initial_checkout = !active_nr;
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
|
@ -941,8 +941,17 @@ int twoway_merge(struct cache_entry **src, struct unpack_trees_options *o)
|
||||
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 deleted_entry(oldtree, current, o);
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,7 @@ struct unpack_trees_options {
|
||||
verbose_update:1,
|
||||
aggressive:1,
|
||||
skip_unmerged:1,
|
||||
initial_checkout:1,
|
||||
gently:1;
|
||||
const char *prefix;
|
||||
int pos;
|
||||
|
Loading…
Reference in New Issue
Block a user