threads / discuss / 56445

stash push/pop unstages files?

Subject: stash push/pop unstages files?

## tl;dr

4 messages between Sep 5, 2021 and Sep 5, 2021.

replies: 3people: 2as markdown or json

Yuri· Sep 5, 2021, 17:09 UTC · lore

In one sub-directory I altered some files, added a directory with files and added the changes (git add .)

Then I called 'git stash push && git stash pop'.

After this the newly added directory remained in the staged status, but altered files became unstaged.

Is this an intended behavior?

Why stash push/pop unstages files? Shouldn't it preserve the directory as-is?

Thanks,
Yuri
Chris Torek· Sep 5, 2021, 17:15 UTC · re: Yuri · lore

Re: stash push/pop unstages files?

On Sun, Sep 5, 2021 at 10:12 AM Yuri <yuri@rawbw.com> wrote:
Show 9 quoted lines
> In one sub-directory I altered some files, added a directory with files
> and added the changes (git add .)
>
> Then I called 'git stash push && git stash pop'.
>
> After this the newly added directory remained in the staged status, but
> altered files became unstaged.
>
> Is this an intended behavior?
Yes.
> Why stash push/pop unstages files? Shouldn't it preserve the directory
> as-is?
It does, *provided* you invoke the pop step with `--index`.

When `git stash push` makes a stash, it saves both the index (staging area) and working tree, as two separate commits.

Later, at the time you apply the saved stash, you choose whether to use the saved index / staging-area (`--index`) or to discard it (no `--index`). The apply step uses the saved working tree in all cases, and if you also stashed untracked files with `-u` or `-a`, it uses this third commit as well.

The `pop` command is just `apply` followed by `drop` if the application succeeds.

Chris
Yuri· Sep 5, 2021, 19:02 UTC · re: Chris Torek · lore

Re: stash push/pop unstages files?

On 9/5/21 10:15 AM, Chris Torek wrote:
> It does,*provided*  you invoke the pop step with `--index`.
>
> When `git stash push` makes a stash, it saves both the index
> (staging area) and working tree, as two separate commits.

Why 'stash push' and 'stash pop' are asymmetric in what they do by default? Wouldn't it make more sense to make 'stash pop' precisely revert what 'stash push' does, and have an option '--no-index' instead?

Yuri
Chris Torek· Sep 5, 2021, 19:19 UTC · re: Yuri · lore

Re: stash push/pop unstages files?

On Sun, Sep 5, 2021 at 12:02 PM Yuri <yuri@rawbw.com> wrote:
> Why 'stash push' and 'stash pop' are asymmetric in what they do by default?
> Wouldn't it make more sense to make 'stash pop' precisely revert what
> 'stash push' does, and have an option '--no-index' instead?

If you ask me, yes, it would—but it would make even *more* sense if `git stash` didn't bother saving the index at all without `--index`, and just errored out if the index and working tree didn't match. But I didn't write `git stash`.

My personal recommendation is: never (or hardly ever) use it. Just make a commit.

Chris

← back to recent threads