[PATCH/RFC] stash: introduce 'stash save --keep-index' option

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: SZEDER
Date: Friday, June 27, 2008 - 7:37 am

'git stash save' saves local modifications to a new stash, and runs 'git
reset --hard' to revert them to a clean index and work tree.  When the
'--keep-index' option is specified, after that 'git reset --hard' the
previous contents of the index is restored and the work tree is updated
to match the index.  This option is useful if the user wants to commit
only parts of his local modifications, but wants to test those parts
before committing.

Also add support for the completion of the new option, and add an
example use case to the documentation.

Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
---

On Fri, Jun 27, 2008 at 09:10:14AM +0200, Björn Steinbrink wrote:
I used to do the same, so I have added a '--keep-index' option to 'git
stash save' to simplify this workflow.  Have a look at the use case
added to the documentation to see, how you could spare the temporary
commit and the 'reset HEAD^'.

RFC, because I'm not quite confident with using plumbing like 'git
read-tree'...  and there are no tests.


 Documentation/git-stash.txt            |   22 +++++++++++++++++++++-
 contrib/completion/git-completion.bash |   13 ++++++++++++-
 git-stash.sh                           |   22 ++++++++++++++++++----
 3 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index baa4f55..936864f 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -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,23 @@ $ 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
+$ git stash save --keep-index
+$ build && run tests
+$ git commit -m 'First part'
+$ git stash apply
+$ build && run tests
+$ git commit -a -m 'Second part'
+----------------------------------------------------------------
+
 SEE ALSO
 --------
 linkgit:git-checkout[1],
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index ebf7cde..9a15500 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1139,8 +1139,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
 }
 
diff --git a/git-stash.sh b/git-stash.sh
index 4938ade..92531a2 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -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
-- 
1.5.6.1.95.ge713

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
An alternate model for preparing partial commits, Robert Anderson, (Thu Jun 26, 11:50 pm)
Re: An alternate model for preparing partial commits, Johannes Sixt, (Fri Jun 27, 1:35 am)
Re: An alternate model for preparing partial commits, Petr Baudis, (Fri Jun 27, 1:50 am)
Re: An alternate model for preparing partial commits, Johannes Schindelin, (Fri Jun 27, 6:33 am)
Re: An alternate model for preparing partial commits, Miklos Vajna, (Fri Jun 27, 6:49 am)
[PATCH/RFC] stash: introduce 'stash save --keep-index' option, SZEDER , (Fri Jun 27, 7:37 am)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 9:54 am)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 10:01 am)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 10:02 am)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 10:14 am)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 10:34 am)
Re: An alternate model for preparing partial commits, Johannes Schindelin, (Fri Jun 27, 10:45 am)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 10:49 am)
Re: An alternate model for preparing partial commits, Junio C Hamano, (Fri Jun 27, 11:15 am)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 11:43 am)
Re: An alternate model for preparing partial commits, David Jeske, (Fri Jun 27, 1:29 pm)
Re: An alternate model for preparing partial commits, Stephen Sinclair, (Fri Jun 27, 1:31 pm)
Re: An alternate model for preparing partial commits, David Jeske, (Fri Jun 27, 1:45 pm)
Re: An alternate model for preparing partial commits, Dmitry Potapov, (Fri Jun 27, 7:14 pm)
Re: An alternate model for preparing partial commits, Robert Anderson, (Fri Jun 27, 7:57 pm)
Re: An alternate model for preparing partial commits, Dmitry Potapov, (Fri Jun 27, 9:03 pm)
Re: An alternate model for preparing partial commits, Jeff King, (Fri Jun 27, 10:03 pm)
Re: An alternate model for preparing partial commits, Robert Anderson, (Sat Jun 28, 12:03 am)
Re: An alternate model for preparing partial commits, Johannes Schindelin, (Sat Jun 28, 7:51 am)
Re: An alternate model for preparing partial commits, Wincent Colaiuta, (Sat Jun 28, 10:23 am)
Re: An alternate model for preparing partial commits, Junio C Hamano, (Sat Jun 28, 2:53 pm)