home | list info | list archive | date index | thread index

[OCLUG-Tech] what is the function of --keep-index/--no-keep-index with git stash?

  • Subject: [OCLUG-Tech] what is the function of --keep-index/--no-keep-index with git stash?
  • From: "Robert P. J. Day" <rpjday [ at ] crashcourse [ dot ] ca>
  • Date: Wed, 24 Jun 2015 06:44:43 -0400 (EDT)
  i'm experimenting with variations of "git stash" and i'm a bit
puzzled by one of the save options. what is the effective difference
between using --keep-index and using --no-keep-index when saving to
the stash?

  i did a simple experiment, and here's what happened. on a new branch
for the linux kernel source, i edited the top-level Makefile, added a
junk line, saved and staged. i then added a second line to that file,
saved but did *not* stage, then did:

  $ git stash save --keep-index

and here's what i found.

  according to what i've read, the reference to the last stash is
saved in the file .git/refs/stash, so i grabbed the commit ID out of
that file, and did a "git show" on it, and here's what i got:

$ git show 70f534241092931d70f352591401e94898d01883
commit 70f534241092931d70f352591401e94898d01883
Merge: d2228e4 edbdb70
Author: Robert P. J. Day <rpjday [ at ] crashcourse [ dot ] ca>
Date:   Wed Jun 24 06:30:49 2015 -0400

    WIP on fred: d2228e4 Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

diff --cc Makefile
index 3ba5044,920c22d..764ba77
--- a/Makefile
+++ b/Makefile
@@@ -1,3 -1,4 +1,5 @@@
+ stage this line               <-----
++but don't stage this line     <-----
  VERSION = 4
  PATCHLEVEL = 1
  SUBLEVEL = 0
$

  note the two lines i've added arrows to -- they clearly represent
both the staged and unstaged changes to that file and i'm *assuming*
that the first two characters are what stash to distinguish between
staged and unstaged changes. i'm just *guessing* that

  "+ " means a staged change
  "++" represents an unstaged change

am i guessing correctly? after all, stash needs *some* way to
distinguish between staged and unstaged changes.

  i then dropped that stash element and did the same thing all over
again, but this time i ran:

  $ git stash save --no-keep-index

when i checked the details of what was stashed, it *looks* identical:

$ git show e47cf959dfded3d55146ca741c9122d71d4694f2
commit e47cf959dfded3d55146ca741c9122d71d4694f2
Merge: d2228e4 69ca32f
Author: Robert P. J. Day <rpjday [ at ] crashcourse [ dot ] ca>
Date:   Wed Jun 24 06:33:57 2015 -0400

    WIP on fred: d2228e4 Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

diff --cc Makefile
index 3ba5044,920c22d..764ba77
--- a/Makefile
+++ b/Makefile
@@@ -1,3 -1,4 +1,5 @@@
+ stage this line
++but don't stage this line
  VERSION = 4
  PATCHLEVEL = 1
  SUBLEVEL = 0
$

  is there supposed to be some kind of difference? i do realize that
when you come to pop, you can specify whether what was in the index
should be restored to the index or not, but i'm just trying to figure
out the functional difference when saving. thoughts?

rday

-- 

========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                        http://crashcourse.ca

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================