Skip to content

Commit

Permalink
stash: drop dirty worktree check on apply
Browse files Browse the repository at this point in the history
Before we apply a stash, we make sure there are no changes
in the worktree that are not in the index. This check dates
back to the original git-stash.sh, and is presumably
intended to prevent changes in the working tree from being
accidentally lost during the merge.

However, this check has two problems:

  1. It is overly restrictive. If my stash changes only file
     "foo", but "bar" is dirty in the working tree, it will
     prevent us from applying the stash.

  2. It is redundant. We don't touch the working tree at all
     until we actually call merge-recursive. But it has its
     own (much more accurate) checks to avoid losing working
     tree data, and will abort the merge with a nicer
     message telling us which paths were problems.

So we can simply drop the check entirely.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Apr 6, 2011
1 parent fa38cfc commit e0e2a9c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
4 changes: 1 addition & 3 deletions git-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -344,9 +344,7 @@ apply_stash () {

assert_stash_like "$@"

git update-index -q --refresh &&
git diff-files --quiet --ignore-submodules ||
die 'Cannot apply to a dirty working tree, please stage your changes'
git update-index -q --refresh || die 'unable to refresh index'

# current index state
c_tree=$(git write-tree) ||
Expand Down
20 changes: 16 additions & 4 deletions t/t3903-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,26 @@ test_expect_success 'parents of stash' '
test_cmp output expect
'

test_expect_success 'apply needs clean working directory' '
echo 4 > other-file &&
test_expect_success 'apply does not need clean working directory' '
echo 4 >other-file &&
git add other-file &&
echo 5 > other-file &&
test_must_fail git stash apply
echo 5 >other-file &&
git stash apply &&
echo 3 >expect &&
test_cmp expect file
'

test_expect_success 'apply does not clobber working directory changes' '
git reset --hard &&
echo 4 >file &&
test_must_fail git stash apply &&
echo 4 >expect &&
test_cmp expect file
'

test_expect_success 'apply stashed changes' '
git reset --hard &&
echo 5 >other-file &&
git add other-file &&
test_tick &&
git commit -m other-file &&
Expand Down

0 comments on commit e0e2a9c

Please sign in to comment.