summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f12e925)
raw | patch | inline | side by side (parent: f12e925)
author | Junio C Hamano <gitster@pobox.com> | |
Sat, 28 Jul 2007 06:41:31 +0000 (23:41 -0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Sat, 28 Jul 2007 07:06:00 +0000 (00:06 -0700) |
Two bugs that made the command practically unusable were fixed
with this.
- A stash created with a clean index does not have any
difference between the base tree and the index tree.
Trying to apply the diff between them to the index would
error out with "No changes". Even when the user asked to
unstash with --index, do not bother with --index action if
the base tree and the index tree match.
- After successfully performing the working tree merge, the
index was reloaded from an earlier state of unstashed index
with "read-tree"; this left all the paths cache dirty. By
moving the call to git-status after this read-tree, match the
cached stat information in the index.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
with this.
- A stash created with a clean index does not have any
difference between the base tree and the index tree.
Trying to apply the diff between them to the index would
error out with "No changes". Even when the user asked to
unstash with --index, do not bother with --index action if
the base tree and the index tree match.
- After successfully performing the working tree merge, the
index was reloaded from an earlier state of unstashed index
with "read-tree"; this left all the paths cache dirty. By
moving the call to git-status after this read-tree, match the
cached stat information in the index.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-stash.sh | patch | blob | history |
diff --git a/git-stash.sh b/git-stash.sh
index 0073e9df5f0e39738107f07919a6f12eafa5ae65..873e7be6ad1f1906546f13fb59f624e2f4e37ae2 100755 (executable)
--- a/git-stash.sh
+++ b/git-stash.sh
c_tree=$(git write-tree) ||
die 'Cannot apply a stash in the middle of a merge'
+ # stash records the work tree, and is a merge between the
+ # base commit (first parent) and the index tree (second parent).
s=$(git rev-parse --revs-only --no-flags --default $ref_stash "$@") &&
w_tree=$(git rev-parse --verify "$s:") &&
- b_tree=$(git rev-parse --verify "$s^:") ||
+ b_tree=$(git rev-parse --verify "$s^1:") &&
+ i_tree=$(git rev-parse --verify "$s^2:") ||
die "$*: no valid stashed state found"
- test -z "$unstash_index" || {
+ unstashed_index_tree=
+ if test -n "$unstash_index" && test "$b_tree" != "$i_tree"
+ then
git diff --binary $s^2^..$s^2 | git apply --cached
test $? -ne 0 &&
die 'Conflicts in index. Try without --index.'
unstashed_index_tree=$(git-write-tree) ||
die 'Could not save index tree'
git reset
- }
+ fi
eval "
GITHEAD_$w_tree='Stashed changes' &&
git read-tree --reset $c_tree &&
git update-index --add --stdin <"$a" ||
die "Cannot unstage modified files"
- git-status
rm -f "$a"
- test -z "$unstash_index" || git read-tree $unstashed_index_tree
+ if test -n "$unstashed_index_tree"
+ then
+ git read-tree "$unstashed_index_tree"
+ fi
+ git status || :
else
# Merge conflict; keep the exit status from merge-recursive
status=$?
- test -z "$unstash_index" || echo 'Index was not unstashed.' >&2
+ if test -n "$unstash_index"
+ then
+ echo >&2 'Index was not unstashed.'
+ fi
exit $status
fi
}