One of our users has just discovered a destructive behavior of git stash --include-untracked: ignored files within non-ignored directories will not be stashed as untracked files (expected), but will still be removed from the working tree. The problem is reproducible by following command sequence:

  $ git init
  $ echo "1" > file.txt
  $ mkdir Data
  $ echo "1" > Data/ignored.txt
  $ echo "Data/*" > .gitignore
  $ git add .
  $ git commit -m "initial import"
  $ echo "2" > file.txt
  $ git stash save --include-untracked
  Saved working directory and index state WIP on master: 6ce5303 initial
  import

  $ git stash show stash@{1}
   file.txt | 2 +-
   1 file changed, 1 insertion(+), 1 deletion(-)

  $ ls Data
  ls: cannot access 'Data': No such file or directory

As you can see, after saving the stash, stash@{1} doesn't contain Data/ignored.txt, but the entire Data directory is still gone from the working tree. As a consequence, applying the stash won't bring back Data/ignored.txt, too.

  $ git stash apply
  On branch master
  Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working
    directory)

          modified:   file.txt

  no changes added to commit (use "git add" and/or "git commit -a")

  $ ls Data
  ls: cannot access 'Data': No such file or directory

Note that when changing .gitignore to "Data/" instead of "Data/*", --include-untracked works as expected.

Tested with: git version 2.13.0.windows.1

-Marc

Reply via email to