105

I would like to stash only the changes in the current folder and its subfolders.

How can I achieve that?

I have tried the obvious approach - git stash . but it doesn't seem to work.

I know I can create temporary commits and delete them afterward, but I want to know if git stash supports stashing specific folders.

Jason Law
  • 965
  • 1
  • 9
  • 21
stdcall
  • 27,613
  • 18
  • 81
  • 125

4 Answers4

200
git stash push -- path/to/folder

Does the trick for me.

gorpacrate
  • 5,109
  • 3
  • 21
  • 18
  • 29
    So to answer OP's question, `git stash push -- .` should do the trick ;) – electronix384128 Jun 20 '19 at 04:03
  • 4
    older versions of git (eg 2.11) have `save` instead of `push`, and does stash all files, not just the specified directory :( – Rafa May 13 '20 at 11:20
  • add `*` at the end to include all the files in the subfolders – Naigel Nov 04 '20 at 12:56
  • @Rafa Right, the [documentation of `git stash`](https://www.git-scm.com/docs/git-stash) says: _`save` This option is deprecated in favour of `git stash push`. It differs from "stash push" in that it cannot take pathspec._ – Melebius Jun 02 '21 at 09:48
16

git stash will not let you save partial directories with a single command, but there are some alternatives.

You can use git stash -p to select only the diffs that you want to stash.

If the output of git stash -p is huge and/or you want a scriptable solution, and it is acceptable to create temporary commits, you can create a commit with all the changes but those in the subdirectory, then stash away the changes, and rewind the commit. In code:

git add -u :/   # equivalent to (cd reporoot && git add -u) without changing $PWD
git reset HEAD .
git commit -m "tmp"
git stash       # this will stash only the files in the current dir
git reset HEAD~
Marco Leogrande
  • 8,050
  • 4
  • 30
  • 48
  • 1
    Tried it, no way.. there's must be a better way – stdcall May 08 '13 at 06:47
  • It prints the diff of all the changes in the project tree, and then I have to manually select which files reside in the specific folder I want. I don't even know the names of the files in that folder. that's not a viable solution to my problem – stdcall May 08 '13 at 06:53
  • @Mellowcandle It is acceptable for you to create temporary commits to solve the problem? – Marco Leogrande May 08 '13 at 06:57
9

This should work for you:

cd <repo_root>
git add .         # add all changed files to index
cd my_folder
git reset .       # except for ones you want to stash
git stash -k      # stash only files not in index
git reset         # remove all changed files from index

Basically, it adds all changed files to index, except for folder (or files) you want to stash. Then you stash them using -k (--keep-index). And finally, you reset index back to where you started.

mvp
  • 111,019
  • 13
  • 122
  • 148
  • 5
    This will actually do something different: `git stash -k` will leave the index intact, so changes in the index will not be deleted, but the new stash will have **both** the changes from the index **and** those not in it, so it will be a "full" stash in any case. – Marco Leogrande May 08 '13 at 19:28
-13

You could checkout one of the GUI git interfaces like SourceTree or TortoiseGit, things like this are what I personally go to tortoise for as it just ends up being much faster than trying to do many commandline commands.

Xylarax
  • 107
  • 9