Merge branch 'am/stash-branch'
* am/stash-branch: Add a test for "git stash branch" Implement "git stash branch <newbranch> <stash>"
This commit is contained in:
commit
671d322035
@ -8,8 +8,11 @@ git-stash - Stash the changes in a dirty working directory away
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git stash' (list | show [<stash>] | apply [<stash>] | clear | drop [<stash>] | pop [<stash>])
|
||||
'git stash' list
|
||||
'git stash' (show | apply | drop | pop ) [<stash>]
|
||||
'git stash' branch <branchname> [<stash>]
|
||||
'git stash' [save [<message>]]
|
||||
'git stash' clear
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -84,6 +87,20 @@ tree's changes, but also the index's ones. However, this can fail, when you
|
||||
have conflicts (which are stored in the index, where you therefore can no
|
||||
longer apply the changes as they were originally).
|
||||
|
||||
branch <branchname> [<stash>]::
|
||||
|
||||
Creates and checks out a new branch named `<branchname>` starting from
|
||||
the commit at which the `<stash>` was originally created, applies the
|
||||
changes recorded in `<stash>` to the new working tree and index, then
|
||||
drops the `<stash>` if that completes successfully. When no `<stash>`
|
||||
is given, applies the latest one.
|
||||
+
|
||||
This is useful if the branch on which you ran `git stash save` has
|
||||
changed enough that `git stash apply` fails due to conflicts. Since
|
||||
the stash is applied on top of the commit that was HEAD at the time
|
||||
`git stash` was run, it restores the originally stashed state with
|
||||
no conflicts.
|
||||
|
||||
clear::
|
||||
Remove all the stashed states. Note that those states will then
|
||||
be subject to pruning, and may be difficult or impossible to recover.
|
||||
|
21
git-stash.sh
21
git-stash.sh
@ -233,6 +233,23 @@ drop_stash () {
|
||||
git rev-parse --verify "$ref_stash@{0}" > /dev/null 2>&1 || clear_stash
|
||||
}
|
||||
|
||||
apply_to_branch () {
|
||||
have_stash || die 'Nothing to apply'
|
||||
|
||||
test -n "$1" || die 'No branch name specified'
|
||||
branch=$1
|
||||
|
||||
if test -z "$2"
|
||||
then
|
||||
set x "$ref_stash@{0}"
|
||||
fi
|
||||
stash=$2
|
||||
|
||||
git-checkout -b $branch $stash^ &&
|
||||
apply_stash --index $stash &&
|
||||
drop_stash $stash
|
||||
}
|
||||
|
||||
# Main command set
|
||||
case "$1" in
|
||||
list)
|
||||
@ -279,6 +296,10 @@ pop)
|
||||
drop_stash "$@"
|
||||
fi
|
||||
;;
|
||||
branch)
|
||||
shift
|
||||
apply_to_branch "$@"
|
||||
;;
|
||||
*)
|
||||
if test $# -eq 0
|
||||
then
|
||||
|
@ -117,4 +117,64 @@ test_expect_success 'stash pop' '
|
||||
test 0 = $(git stash list | wc -l)
|
||||
'
|
||||
|
||||
cat > expect << EOF
|
||||
diff --git a/file2 b/file2
|
||||
new file mode 100644
|
||||
index 0000000..1fe912c
|
||||
--- /dev/null
|
||||
+++ b/file2
|
||||
@@ -0,0 +1 @@
|
||||
+bar2
|
||||
EOF
|
||||
|
||||
cat > expect1 << EOF
|
||||
diff --git a/file b/file
|
||||
index 257cc56..5716ca5 100644
|
||||
--- a/file
|
||||
+++ b/file
|
||||
@@ -1 +1 @@
|
||||
-foo
|
||||
+bar
|
||||
EOF
|
||||
|
||||
cat > expect2 << EOF
|
||||
diff --git a/file b/file
|
||||
index 7601807..5716ca5 100644
|
||||
--- a/file
|
||||
+++ b/file
|
||||
@@ -1 +1 @@
|
||||
-baz
|
||||
+bar
|
||||
diff --git a/file2 b/file2
|
||||
new file mode 100644
|
||||
index 0000000..1fe912c
|
||||
--- /dev/null
|
||||
+++ b/file2
|
||||
@@ -0,0 +1 @@
|
||||
+bar2
|
||||
EOF
|
||||
|
||||
test_expect_success 'stash branch' '
|
||||
echo foo > file &&
|
||||
git commit file -m first
|
||||
echo bar > file &&
|
||||
echo bar2 > file2 &&
|
||||
git add file2 &&
|
||||
git stash &&
|
||||
echo baz > file &&
|
||||
git commit file -m second &&
|
||||
git stash branch stashbranch &&
|
||||
test refs/heads/stashbranch = $(git symbolic-ref HEAD) &&
|
||||
test $(git rev-parse HEAD) = $(git rev-parse master^) &&
|
||||
git diff --cached > output &&
|
||||
test_cmp output expect &&
|
||||
git diff > output &&
|
||||
test_cmp output expect1 &&
|
||||
git add file &&
|
||||
git commit -m alternate\ second &&
|
||||
git diff master..stashbranch > output &&
|
||||
test_cmp output expect2 &&
|
||||
test 0 = $(git stash list | wc -l)
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user