Skip to content
/ git Public
forked from git/git

Commit

Permalink
Revert "stash: require a clean index to apply"
Browse files Browse the repository at this point in the history
This reverts commit ed178ef.

That commit was an attempt to improve the safety of applying
a stash, because the application process may create
conflicted index entries, after which it is hard to restore
the original index state.

Unfortunately, this hurts some common workflows around "git
stash -k", like:

    git add -p       ;# (1) stage set of proposed changes
    git stash -k     ;# (2) get rid of everything else
    make test        ;# (3) make sure proposal is reasonable
    git stash apply  ;# (4) restore original working tree

If you "git commit" between steps (3) and (4), then this
just works. However, if these steps are part of a pre-commit
hook, you don't have that opportunity (you have to restore
the original state regardless of whether the tests passed or
failed).

It's possible that we could provide better tools for this
sort of workflow. In particular, even before ed178ef, it
could fail with a conflict if there were conflicting hunks
in the working tree and index (since the "stash -k" puts the
index version into the working tree, and we then attempt to
apply the differences between HEAD and the old working tree
on top of that). But the fact remains that people have been
using it happily for a while, and the safety provided by
ed178ef is simply not that great. Let's revert it for now.
In the long run, people can work on improving stash for this
sort of workflow, but the safety tradeoff is not worth it in
the meantime.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
peff authored and gitster committed Jun 15, 2015
1 parent ed178ef commit 1937610
Show file tree
Hide file tree
Showing 2 changed files with 0 additions and 9 deletions.
2 changes: 0 additions & 2 deletions git-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -442,8 +442,6 @@ apply_stash () {
assert_stash_like "$@"

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

# current index state
c_tree=$(git write-tree) ||
Expand Down
7 changes: 0 additions & 7 deletions t/t3903-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,6 @@ test_expect_success 'applying bogus stash does nothing' '
test_cmp expect file
'

test_expect_success 'apply requires a clean index' '
test_when_finished "git reset --hard" &&
echo changed >other-file &&
git add other-file &&
test_must_fail git stash apply
'

test_expect_success 'apply does not need clean working directory' '
echo 4 >other-file &&
git stash apply &&
Expand Down

0 comments on commit 1937610

Please sign in to comment.