Skip to content

Commit ed178ef

Browse files
peffgitster
authored andcommitted
stash: require a clean index to apply
If you have staged contents in your index and run "stash apply", we may hit a conflict and put new entries into the index. Recovering to your original state is difficult at that point, because tools like "git reset --keep" will blow away anything staged. We can make this safer by refusing to apply when there are staged changes. It's possible we could provide better tooling here, as "git stash apply" should be writing only conflicts to the index (so we know that any stage-0 entries are potentially precious). But it is the odd duck; most "mergy" commands will update the index for cleanly merged entries, and it is not worth updating our tooling to support this use case which is unlikely to be of interest (besides which, we would still need to block a dirty index for "stash apply --index", since that case _would_ be ambiguous). Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 88bab59 commit ed178ef

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

git-stash.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,8 @@ apply_stash () {
442442
assert_stash_like "$@"
443443

444444
git update-index -q --refresh || die "$(gettext "unable to refresh index")"
445+
git diff-index --cached --quiet --ignore-submodules HEAD -- ||
446+
die "$(gettext "Cannot apply stash: Your index contains uncommitted changes.")"
445447

446448
# current index state
447449
c_tree=$(git write-tree) ||

t/t3903-stash.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ test_expect_success 'applying bogus stash does nothing' '
4545
test_cmp expect file
4646
'
4747

48+
test_expect_success 'apply requires a clean index' '
49+
test_when_finished "git reset --hard" &&
50+
echo changed >other-file &&
51+
git add other-file &&
52+
test_must_fail git stash apply
53+
'
54+
4855
test_expect_success 'apply does not need clean working directory' '
4956
echo 4 >other-file &&
5057
git stash apply &&

0 commit comments

Comments
 (0)