Commit a56c8f5a authored by Aaron M Watson's avatar Aaron M Watson Committed by Junio C Hamano

stash: allow stashes to be referenced by index only

Instead of referencing "[email protected]{n}" explicitly, make it possible to
simply reference as "n".  Most users only reference stashes by their
position in the stash stack (what I refer to as the "index" here).

The syntax for the typical stash ([email protected]{n}) is slightly annoying and
easy to forget, and sometimes difficult to escape properly in a
script. Because of this the capability to do things with the stash by
simply referencing the index is desirable.

This patch includes the superior implementation provided by Øsse Walle
(thanks for that), with a slight change to fix a broken test in the test
suite. I also merged the test scripts as suggested by Jeff King, and
un-wrapped the documentation as suggested by Junio Hamano.
Signed-off-by: default avatarAaron M Watson <[email protected]>
Reviewed-by: default avatarJeff King <[email protected]>
parent 65988948
......@@ -39,7 +39,8 @@ The latest stash you created is stored in `refs/stash`; older
stashes are found in the reflog of this reference and can be named using
the usual reflog syntax (e.g. `[email protected]{0}` is the most recently
created stash, `[email protected]{1}` is the one before it, `[email protected]{2.hours.ago}`
is also possible).
is also possible). Stashes may also be referenced by specifying just the
stash index (e.g. the integer `n` is equivalent to `[email protected]{n}`).
......@@ -384,9 +384,8 @@ parse_flags_and_rev()
REV=$(git rev-parse --no-flags --symbolic --sq "[email protected]") || exit 1
for opt
case "$opt" in
......@@ -404,6 +403,9 @@ parse_flags_and_rev()
die "$(eval_gettext "unknown option: \$opt")"
FLAGS="${FLAGS}${FLAGS:+ }$opt"
REV="${REV}${REV:+ }'$opt'"
......@@ -422,6 +424,15 @@ parse_flags_and_rev()
case "$1" in
set -- "${ref_stash}@{$1}"
REV=$(git rev-parse --symbolic --verify --quiet "$1") || {
die "$(eval_gettext "\$reference is not a valid reference")"
......@@ -131,6 +131,26 @@ test_expect_success 'drop middle stash' '
test 1 = $(git show HEAD:file)
test_expect_success 'drop middle stash by index' '
git reset --hard &&
echo 8 >file &&
git stash &&
echo 9 >file &&
git stash &&
git stash drop 1 &&
test 2 = $(git stash list | wc -l) &&
git stash apply &&
test 9 = $(cat file) &&
test 1 = $(git show :file) &&
test 1 = $(git show HEAD:file) &&
git reset --hard &&
git stash drop &&
git stash apply &&
test 3 = $(cat file) &&
test 1 = $(git show :file) &&
test 1 = $(git show HEAD:file)
test_expect_success 'stash pop' '
git reset --hard &&
git stash pop &&
......@@ -604,6 +624,21 @@ test_expect_success 'invalid ref of the form [email protected]{n}, n >= N' '
git stash drop
test_expect_success 'invalid ref of the form "n", n >= N' '
git stash clear &&
test_must_fail git stash drop 0 &&
echo bar5 >file &&
echo bar6 >file2 &&
git add file2 &&
git stash &&
test_must_fail git stash drop 1 &&
test_must_fail git stash pop 1 &&
test_must_fail git stash apply 1 &&
test_must_fail git stash show 1 &&
test_must_fail git stash branch tmp 1 &&
git stash drop
test_expect_success 'stash branch should not drop the stash if the branch exists' '
git stash clear &&
echo foo >file &&
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment