I used "git stash -- path" for the first time today and happened to
notice an oddity. If I run:

        git init -q repo
        cd repo
        
        for i in one two; do
                echo content >$i
                git add $i
        done
        git commit -qm base
        
        for i in one two; do
                echo change >$i
        done
        git stash -- one

it says:

  Saved working directory and index state WIP on master: 20cfadf base
  Unstaged changes after reset:
  M     one
  M     two

Even though "one" no longer has unstaged changes.

If I run with GIT_TRACE=1, that message is generated by:

  git reset -- one

which makes sense. At that stage we've just reset the index, but the
working tree file still has modifications. In the non-pathspec case we
run "git reset --hard", which takes care of the index and the working
tree.

It's really "checkout-index" that cleans the working tree, but it
doesn't have porcelain finery like an "Unstaged changes" message. I
think the patch below would fix it, but I wonder if we can do it in a
way that doesn't involve calling diff-files twice.

-Peff

---
diff --git a/git-stash.sh b/git-stash.sh
index 9c70662cc..9a4bb503a 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -299,10 +299,15 @@ push_stash () {
        then
                if test $# != 0
                then
-                       git reset ${GIT_QUIET:+-q} -- "$@"
+                       git reset -q -- "$@"
                        git ls-files -z --modified -- "$@" |
                        git checkout-index -z --force --stdin
                        git clean --force ${GIT_QUIET:+-q} -d -- "$@"
+                       if test -z "$GIT_QUIET" && ! git diff-files --quiet
+                       then
+                               say "$(gettext "Unstaged changes after reset:")"
+                               git diff-files --name-status
+                       fi
                else
                        git reset --hard ${GIT_QUIET:+-q}
                fi

Reply via email to