Merge branch 'sg/stash-k-i'

* sg/stash-k-i:
  Documentation: tweak use case in "git stash save --keep-index"
  stash: introduce 'stash save --keep-index' option
This commit is contained in:
Junio C Hamano 2008-07-13 15:15:27 -07:00
commit 15fc1c02fc
3 changed files with 52 additions and 6 deletions

View File

@ -36,12 +36,15 @@ is also possible).
OPTIONS
-------
save [<message>]::
save [--keep-index] [<message>]::
Save your local modifications to a new 'stash', and run `git reset
--hard` to revert them. This is the default action when no
subcommand is given. The <message> part is optional and gives
the description along with the stashed state.
+
If the `--keep-index` option is used, all changes already added to the
index are left intact.
list [<options>]::
@ -169,6 +172,24 @@ $ git stash apply
... continue hacking ...
----------------------------------------------------------------
Testing partial commits::
You can use `git stash save --keep-index` when you want to make two or
more commits out of the changes in the work tree, and you want to test
each change before committing:
+
----------------------------------------------------------------
... hack hack hack ...
$ git add --patch foo # add just first part to the index
$ git stash save --keep-index # save all other changes to the stash
$ edit/build/test first part
$ git commit foo -m 'First part' # commit fully tested change
$ git stash pop # prepare to work on all other changes
... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'
----------------------------------------------------------------
SEE ALSO
--------
linkgit:git-checkout[1],

View File

@ -1163,8 +1163,19 @@ _git_show ()
_git_stash ()
{
local subcommands='save list show apply clear drop pop create'
if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
local subcommand="$(__git_find_subcommand "$subcommands")"
if [ -z "$subcommand" ]; then
__gitcomp "$subcommands"
else
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$subcommand,$cur" in
save,--*)
__gitcomp "--keep-index"
;;
*)
COMPREPLY=()
;;
esac
fi
}

View File

@ -86,6 +86,13 @@ create_stash () {
}
save_stash () {
keep_index=
case "$1" in
--keep-index)
keep_index=t
shift
esac
stash_msg="$1"
if no_changes
@ -104,6 +111,13 @@ save_stash () {
git update-ref -m "$stash_msg" $ref_stash $w_commit ||
die "Cannot save the current status"
printf 'Saved working directory and index state "%s"\n' "$stash_msg"
git reset --hard
if test -n "$keep_index" && test -n $i_tree
then
git read-tree --reset -u $i_tree
fi
}
have_stash () {
@ -153,7 +167,8 @@ apply_stash () {
die "$*: no valid stashed state found"
unstashed_index_tree=
if test -n "$unstash_index" && test "$b_tree" != "$i_tree"
if test -n "$unstash_index" && test "$b_tree" != "$i_tree" &&
test "$c_tree" != "$i_tree"
then
git diff-tree --binary $s^2^..$s^2 | git apply --cached
test $? -ne 0 &&
@ -235,7 +250,7 @@ show)
;;
save)
shift
save_stash "$*" && git-reset --hard
save_stash "$*"
;;
apply)
shift
@ -268,8 +283,7 @@ pop)
if test $# -eq 0
then
save_stash &&
echo '(To restore them type "git stash apply")' &&
git-reset --hard
echo '(To restore them type "git stash apply")'
else
usage
fi