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

Re: "git stash pop" is doing an unwanted "git add" when there are conflicts.

From
AMAlan Mackenzie <acm@muc.de>
Date
Dec 24, 2015, 09:20 UTC
Message-ID
<20151224092038.GA2397@acm.fritz.box>
In-Reply-To
<20151222093032.GA5173@sigill.intra.peff.net>
Hello, Jeff.
On Tue, Dec 22, 2015 at 04:30:33AM -0500, Jeff King wrote:
> On Tue, Dec 22, 2015 at 09:17:38AM +0100, Dennis Kaarsemaker wrote:
> > On ma, 2015-12-21 at 14:29 +0000, Alan Mackenzie wrote:
> > > Hello, git project.
> > > Last night, whilst clearing out a stale "stash stack", I did "git stash
> > > pop".  There were conflicts in two files.
> > > However, all the popped files became staged.  This doesn't normally happen.
> > > It was intensely irritating, and required me to do "git reset HEAD" on
> > > each of the files, none of which I wanted to commit.
> > > I searched the git-stash man page for this scenario, but found nothing
> > > about it.
> > > Surely staging all the files is a bug?
Show 5 quoted lines
> > That depends. A stash is two commits: one for all changes that were in
> > the index when you ran 'git stash save' and one for all changes not yet
> > in the index. When you pop the stash, these then get restored as staged
> > resp. unstaged changes. So if your changes are now all staged, I'd
> > wager that they were staged when you ran git stash save.
> No, I think there's something else going on. Try this:
>     git init repo &&
>     cd repo &&
>     echo base >one &&
>     echo base >two &&
>     git add . &&
>     git commit -m base &&
>     echo stash >one &&
>     echo stash >two &&
>     git stash &&
>     echo "==> No conflicts, nothing staged"
>     git stash apply &&
>     git reset --hard &&
>     echo changes >two &&
>     git commit -am changes &&
>     echo "==> Conflict stages non-conflicting file 'one'"
>     ! git stash apply &&
>     git status
Thanks for creating a reproducible test case for me!
> It seems to be a side effect of merge-recursive to stage the results,
> and in the no-conflict path we explicitly reset the index. For the
> conflicting case, it's trickier, because we would want to retain the
> unmerged entries.
> So I agree it's kind of weird, but the conflicting case is inherently
> going to touch the index, and you'd generally have to `git add` to mark
> the resolutions (but if you really want to just touch the working tree,
> you'd need to `git reset`).
>From the point of view of a user, this is suboptimal.  git stash is an

abstraction: the preservation of uncomitted changes for later. Staging previously unstaged changes with git stash pop severely damages this abstraction.

Are there any prospects of this getting fixed?
> -Peff
-- 
Alan Mackenzie (Nuremberg, Germany).
Previous: Jeff KingNext: Jeff King
Message 5 of 10 in “"git stash pop" is doing an unwanted "git add" when there are conflicts.”
  1. Alan MackenzieDec 21, 2015
  2. Alan MackenzieDec 21, 2015
  3. Dennis KaarsemakerDec 22, 2015
  4. Jeff KingDec 22, 2015
  5. Alan MackenzieDec 24, 2015
  6. Jeff KingDec 29, 2015
  7. Junio C HamanoDec 29, 2015
  8. Jeff KingDec 30, 2015
  9. Alan MackenzieDec 29, 2015
  10. Jeff KingDec 30, 2015

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.