git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [BUG] git stash --keep-index undeletes file

From
CVChristian Vetter <christian@rasenplanscher.info>
Date
Apr 16, 2019, 19:57 UTC
Message-ID
<1555444649793.14863@rasenplanscher.info>
In-Reply-To
<20190416184816.GU16414@hank.intra.tgummerer.com>
Thank you, Thomas!

Now that you explained this, I do understand the behaviour, and agree that it is correct. While this seems to be clear with a deeper understanding of git than I have, it might be a good idea to specifically point this out in the docs in the context of `--keep-index`. That would have helped me.

This does, however, bring me back to a related issue by which I stumbled across this: If, in the given scenario, I run `git stash apply`, the file is not removed. `git status` still outputs this:

Show 10 quoted lines
> On branch master
> Changes to be committed:
>   (use "git reset HEAD <file>..." to unstage)
>
>         deleted:    file
>
> Untracked files:
>   (use "git add <file>..." to include in what will be committed)
>
>         file

Can you explain that behaviour as well? The way I understand it, `git stash push --keep-index; git stash apply` should result in zero change to the output of `git status`. What am I not getting?

________________________________________
From: Thomas Gummerer <t.gummerer@gmail.com>
Sent: Tuesday, April 16, 2019 20:48
To: Christian Vetter
Cc: git@vger.kernel.org
Subject: Re: [BUG] git stash --keep-index undeletes file
On 04/16, Christian Vetter wrote:
Show 23 quoted lines
> Steps to reproduce
> + mkdir git-stash-test
> + cd git-stash-test
> + git init
> + touch file
> + git add file
> + git commit -m init
> + git rm file
> + git stash push --keep-index
>
>
> Result:
> `git status` gives this output:
> > On branch master
> > Changes to be committed:
> >   (use "git reset HEAD <file>..." to unstage)
> >
> >         deleted:    file
> >
> > Untracked files:
> >   (use "git add <file>..." to include in what will be committed)
> >
> >         file

I think this is the correct result. --keep-index keeps the changes that are in the index, in this example that 'file' is deleted, but restores the working tree to 'HEAD', where 'file' existed. It's now showing up as untracked because Git doesn't know about it.

Similarly if you just did 'git stash push' without --keep-index, 'file' would be restored in your working tree, but 'git status' would report the working tree as clean because it would also be restored in the index.

Show 7 quoted lines
> Expected:
> `git status` gives this output:
> > On branch master
> > Changes to be committed:
> >   (use "git reset HEAD <file>..." to unstage)
> >
> >         deleted:    file

This is what you get before 'git stash push --keep-index'. Do you think the documentation on '--keep-index' is unclear, and could be improved? Or why did you think that this is the correct output?

> Verified on:
> + Windows 10, git version 2.21.0.windows.1
> + Ubuntu 14.04, git version 2.21.0
Previous: Thomas GummererNext: Thomas Gummerer
Message 3 of 4 in “[BUG] git stash --keep-index undeletes file”
  1. Christian VetterApr 16, 2019
  2. Thomas GummererApr 16, 2019
  3. Christian VetterApr 16, 2019
  4. Thomas GummererApr 16, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.