Here's the series I mentioned a couple of times on the list already, introducing a no-overlay mode in 'git checkout'. The inspiration for this came from Junios message in [*1*]. Basically the idea is to also delete files when the match <pathspec> in 'git checkout <tree-ish> -- <pathspec>' in the current tree, but don't match <pathspec> in <tree-ish>. The rest of the cases are already properly taken care of by 'git checkout'. The final step in the series is to actually make use of this in 'git stash', which simplifies the code there a bit. I am however happy to hold off on this step until the stash-in-C series is merged, so we don't delay that further. In addition to the no-overlay mode, we also add a --cached mode, which works only on the index, thus similar to 'git reset <tree-ish> -- <pathspec>'. Actually deprecating 'git reset <tree-ish> -- <pathspec>' should come later, probably not before Duy's restore-files command lands, as 'git checkout --no-overlay <tree-ish> -- <pathspec>' is a bit cumbersome to type compared to 'git reset <tree-ish> -- <pathspec>'. My hope is also that the no-overlay mode could become the new default in the restore-files command Duy is currently working on. No documentation yet, as I wanted to get this out for review first. I'm not familiar with most of the code I touched here, so there may well be much better ways to implement some of this, that I wasn't able to figure out. I'd be very happy with some feedback around that. Another thing I'm not sure about is how to deal with conflicts. In the cached mode this patch series is not dealing with it at all, as 'git checkout -- <pathspec>' when pathspec matches a file with conflicts doesn't update the index. For the no-overlay mode, the file is removed if the corresponding stage is not found in the index. I'm however not sure this is the right thing to do in all cases? *1*: <xmqq4loqplou.fsf@xxxxxxxxxxxxxxxxxxxxxxxxxxx> Thomas Gummerer (8): move worktree tests to t24* entry: factor out unlink_entry function entry: support CE_WT_REMOVE flag in checkout_entry read-cache: add invalidate parameter to remove_marked_cache_entries checkout: introduce --{,no-}overlay option checkout: add --cached option checkout: add allow ignoring unmatched pathspec stash: use git checkout --index builtin/checkout.c | 66 +++++++++-- cache.h | 7 +- entry.c | 22 ++++ git-stash.sh | 12 +- read-cache.c | 8 +- split-index.c | 2 +- t/t2016-checkout-patch.sh | 8 ++ t/t2022-checkout-paths.sh | 9 ++ t/t2025-checkout-no-overlay.sh | 31 ++++++ t/t2026-checkout-cached.sh | 103 ++++++++++++++++++ ...-worktree-add.sh => t2400-worktree-add.sh} | 0 ...ktree-prune.sh => t2401-worktree-prune.sh} | 0 ...orktree-list.sh => t2402-worktree-list.sh} | 0 t/t9902-completion.sh | 3 + unpack-trees.c | 21 +--- 15 files changed, 251 insertions(+), 41 deletions(-) create mode 100755 t/t2025-checkout-no-overlay.sh create mode 100755 t/t2026-checkout-cached.sh rename t/{t2025-worktree-add.sh => t2400-worktree-add.sh} (100%) rename t/{t2026-worktree-prune.sh => t2401-worktree-prune.sh} (100%) rename t/{t2027-worktree-list.sh => t2402-worktree-list.sh} (100%) -- 2.20.0.rc2.411.g8f28e744c2