Browse Source

Merge branch 'nd/switch-and-restore'

"git restore --staged" did not correctly update the cache-tree
structure, resulting in bogus trees to be written afterwards, which
has been corrected.

* nd/switch-and-restore:
  restore: invalidate cache-tree when removing entries with --staged
maint
Junio C Hamano 5 years ago
parent
commit
09e393d913
  1. 2
      builtin/checkout.c
  2. 17
      t/t2070-restore.sh

2
builtin/checkout.c

@ -524,6 +524,8 @@ static int checkout_paths(const struct checkout_opts *opts, @@ -524,6 +524,8 @@ static int checkout_paths(const struct checkout_opts *opts,
/* Now we are committed to check them out */
if (opts->checkout_worktree)
errs |= checkout_worktree(opts);
else
remove_marked_cache_entries(&the_index, 1);

/*
* Allow updating the index when checking out from the index.

17
t/t2070-restore.sh

@ -106,4 +106,21 @@ test_expect_success 'restore --staged adds deleted intent-to-add file back to in @@ -106,4 +106,21 @@ test_expect_success 'restore --staged adds deleted intent-to-add file back to in
git diff --cached --exit-code
'

test_expect_success 'restore --staged invalidates cache tree for deletions' '
test_when_finished git reset --hard &&
>new1 &&
>new2 &&
git add new1 new2 &&

# It is important to commit and then reset here, so that the index
# contains a valid cache-tree for the "both" tree.
git commit -m both &&
git reset --soft HEAD^ &&

git restore --staged new1 &&
git commit -m "just new2" &&
git rev-parse HEAD:new2 &&
test_must_fail git rev-parse HEAD:new1
'

test_done

Loading…
Cancel
Save