How do you stash an untracked file?
Asked Answered
G

21

2363

I have changes to a file, plus a new file, and would like to use git stash to put them away while I switch to another task. But git stash by itself stashes only the changes to the existing file; the new file remains in my working tree, cluttering up my future work. How do I stash this untracked file?

Giaour answered 7/5, 2009 at 15:54 Comment(2)
Be aware that if you only have untracked files in your stash, it will look like it's an empty one, as in git stash show returns nothing and you may be tempted to drop it (as I just did while it contained a useful script I wrote some months ago → how to recover a dropped stash)Balanchine
I don't understand why doesn't stash just work normally with untracked files as it does to tracked ones, this different treatment makes things so complicated and I just don't see the benefitHurty
Y
3406

To stash your working directory including untracked files (especially those that are in the .gitignore) then you probably want to use this cmd:

git stash --include-untracked

Alternatively, you can use the shorthand -u instead of --include-untracked, or simply git stash --all (see warning below for this one) which stashes all files, including untracked and ignored files. This behaviour changed in 2018, so make sure your git is up to date.


Warning: there seems to be (or have been) situations in which contents of ignored directories could be deleted permanently. See this archived website for more information.

Yak answered 7/5, 2009 at 16:2 Comment(27)
Why does stash still stash changed existing files even though those changes haven't been staged?Sufflate
@alan-christensen Read the DESCRIPTION of kernel.org/pub/software/scm/git/docs/git-stash.html. The point is to have a clean working tree after stashing.Ritornello
@Ritornello new files that have not been staged (i.e. untracked) are not stashed; they are left in the working directory.Sufflate
@alan-christensen when you said "changed existing files ... that haven't been staged" I took that to mean files that had been committed previously, then modified, but haven't been added to the index. If you meant untracked files, then maybe you meant to ask "Why doesn't" instead of "Why does".Ritornello
@Ritornello what I meant in my comment was that it doesn't stash new files unless they have been staged however it does stash existing files even if they haven't been staged. Seems inconsistent to me.Sufflate
All moot now that it will stash untracked files with no staging required as of 1.7.7.Jameejamel
Is it just me or does git stash -u only stash untracked files but not the unstaged modifications? If so how do you stash the working copy as is without having to add whether new or old?Goldsworthy
@AlanChristensen the point is to stash things that might be overwritten by checkout of a different branch.Whiteheaded
git stash pop will retrieve the deleted files.Much
That is: git stash save -u "my save"Aetna
as @surfer190 said, it's git stash save -uNegligence
I run git stash save -u on Windows, end up getting an inaccessible folder of the untracked folder, cannot be deleted even by admin...Fuzzy
I also found git stash save -u --keep-index to be useful.Shebeen
your answer removed all the tracked files i had stashed earlierSamothrace
Just to extend the warning about gitignored files.. in particular if you develop a Node application with gitignored node_modules, this will attempt to stash the entire node_modules, which may take a LOT of time and space if you have many dependenciesNaivete
Suggesting to add untracked files and then stashing them is a great hackUndulant
this is alongside git stash apply [1] is a game changer! - more info on apply here https://mcmap.net/q/11726/-lost-git-stash-changesBoorman
I think it is a mistake to leave git stash --all as the top-most "answer" in this answer given how much it can mess up files included in .gitignore.Casaubon
As you have the top answer here, I would request that you list git stash --include-untracked before git stash --all in your answer for two reasons. First it answers the OP's question better now in 2019 and second because --all does something that most users probably don't want in that it removes all of the files which are .gitignoredOlivann
If you add untracked files with -u/--include-untracked, git stash show and git stash show --stat show no sign of the untracked file. This is especially confusing with a mix of tracked and untracked, because it makes it look like git has irrecoverably deleted the untracked file. The file is restored when popped or applied.Marsala
I had to write git stash save --include-untracked, i.e. to include the "save" for this to work. I use git version 2.11.0Rann
git stash --all modifies folder node_modulesOtolith
I would put more warnings around using git stash --all. Something along the lines of: NOTE: Using git stash --all will stash all .gitignore'd files which may be CPU intensive and not what you want. Common ignored files you may not want stashed include: Log files (can be huge), project config files, libraries like JS node_modules, OS files like .DS_Store, etc. It would make this popular answer more useful at a quick glance.Coarse
The bug with directory/* entry files in .gitignore being permanently deleted has been fixed in version 2.14.0 github.com/git/git/blob/master/Documentation/RelNotes/…Mayne
Do not use git stash --all it's almost surely NOT what you want. Use -uDonnydonnybrook
Other than using an alias, is there a way to configure the command to always stash untracked files without having to use -u?Intrude
With message: git stash push --include-untracked --message "Foo", thanks to https://mcmap.net/q/11727/-how-can-you-git-stash-untracked-files-with-a-custom-messageUltrasonics
I
523

As of git 1.7.7, git stash accepts the --include-untracked option (or short-hand -u). To include untracked files in your stash, use either of the following commands:

git stash --include-untracked
# or
git stash -u

Warning, doing this will permanently delete your files if you have any directory/ entries in your gitignore file.*

Inaugurate answered 25/7, 2011 at 15:49 Comment(9)
Cool - it finally works as described in the manual page. Not stashing (and cleaning) new files is broken behaviour.Isisiskenderun
my version of git is 1.9.1 and even if what i have in .gitignore looks like this ignoredDirectory and not ignoredDirectory/* it still deletes those untracked. Even untracked files not just directories.Thrippence
Can you please explain the warning? Why would it delete those files? Does it delete them and not stash them? I've used Git for a while and haven't run into this problem.Vesture
Does the warning apply to *.extension entries as well?Sedan
@aleksandr-dubinsky, @Sedan - git 1.8.3 -u (--include-untracked) option can stash and pop untracked files okay but git stash show does not list the untracked files that are in the stashTurgeon
@Turgeon is right. For a discussion to show the untracked part of a stash, see https://mcmap.net/q/11474/-in-git-is-there-a-way-to-show-untracked-stashed-files-without-applying-the-stashSchreibe
@SteveBennett Not stashing (and cleaning) new files is broken behaviour. -- here, did you mean if we don't stash untracked files then things will break? Thanks in advance!Shallow
Well, they could, depending on your project. Git itself wouldn't break.Isisiskenderun
I like git stash -u as it relates to git add -u which is used for staging changes excluding the untracked files.Premonition
G
140

Add the file to the index:

git add path/to/untracked-file
git stash

The entire contents of the index, plus any unstaged changes to existing files, will all make it into the stash.

Giaour answered 7/5, 2009 at 15:57 Comment(8)
What if you don't want to stash changes that are already in the index? Is stashing the new file still possible?Barrator
Commit the index, stash the new file, then revert the commit and/or check the files out from the commit. It's a kludgy solution, but it should work.Magill
git add . wasn't taking it into consideration for some reasonBarnett
Better answer because --include-untracked will pick up everything, esp hidden directories; like node_modules or .pytest_cache and whatever stuff you have lying around which is not in .gitignore.Constrict
This didn't work for me, I had to --include-untracked.Overcome
This works, however when I apply the stash back it shows as change to be commited instead of being ignored - how to avoid it?Hoot
@Hoot after you pop/apply the stashed changes, git reset will clear changes to the index, but leave them in the working tree, because the default mode is --mixed.Connive
To ignore local changes, add --staged to the git stash command.Santo
M
74

In git bash, stashing of untracked files is achieved by using the command

git stash --include-untracked
# or
git stash -u

http://git-scm.com/docs/git-stash

git stash removes any untracked or uncommited files from your workspace. And you can revert git stash by using following commands

git stash pop

This will place the file back in your local workspace.

My experience

I had to perform a modification to my gitIgnore file to avoid movement of .classpath and .project files into remote repo. I am not allowed to move this modified .gitIgnore in remote repo as of now.

.classpath and .project files are important for eclipse - which is my java editor.

I first of all selectively added my rest of the files and committed for staging. However, final push cannot be performed unless the modified .gitIgnore fiels and the untracked files viz. .project and .classpath are not stashed.

I used

git stash

for stashing the modified .gitIgnore file.

For stashing .classpath and .project file, I used

git stash --include-untracked

and it removed the files from my workspace. Absence of these files takes away my capability of working on my work location in eclipse. I proceeded on with completing the procedure for pushing the committed files to remote. Once this was done successfully, I used

git stash pop

This pasted the same files back in my workspace. This gave back to me my ability to work on the same project in eclipse. Hope this brushes aside misconceptions.

Much answered 28/8, 2014 at 20:46 Comment(2)
Why dont you use global gitignore for IDE files? Ie. use ~/.gitignore.Hinduism
this works well, the only issue I had was that git stash show only listed the modified files and not the untracked ones... initially, I thought that I lost a lot of work...Moribund
T
41

On git version 2.8.1: following works for me.

To save modified and untracked files in stash without a name

git stash save -u

To save modified and untracked files in stash with a name

git stash save -u <name_of_stash>

You can use either pop or apply later as follows.

git stash pop

git stash apply stash@{0}
Tachycardia answered 20/2, 2018 at 9:23 Comment(3)
This didn't remove the untracked files from my computer, though they were no longer listed as untracked. git stash show did not show them. When I tried git stash apply, I got "error: could not restore untracked files from stash". However, the files were then once again listed as untracked, but changes to tracked files were not restored. I think those files could be restored individually by checking them out of the stash, but this solution was not what I'd hoped for.Jacindajacinta
Did you see the title of this question? It is "How do you stash an untracked file?". I didn't understand, what you are trying to do here. Above answer is very clear for the question. You need to use git stash show -p stash@{0} to view the most recent stash in patch form.Tachycardia
user1012513, I assume your last comment was addressed to me. I stand by the comment, for the reasons indicated. I got an error when I tried git stash apply. Note that adding stash@{0} only tells git that you're trying to apply the most recent stash, which is implied when omitted and thus not necessary. Maybe something has changed since 2018, or maybe there's something different about my situation, but I thought people should be aware of my experience, since it was unexpected for me. That doesn't mean your solution isn't useful for some people.Jacindajacinta
L
28

New in version 2.35

git stash‘s new --staged mode makes it easy to stash away what you already have in the staging area, and nothing else. You can think of it like git commit (which only writes staged changes), but instead of creating a new commit, it writes a new entry to the stash. Then, when you’re ready, you can recover your changes (with git stash pop) and keep working.

git add -A
git stash --staged
Leisured answered 29/1, 2022 at 6:6 Comment(3)
Great mode (--staged) and great solution! I've been waiting for this for so long... Thank you!Richman
What about with an specific file?Mortgagee
git add specific_file && git stash --stagedLeisured
U
23

Updated Answer In 2020

I was surprised that no other answers on this page mentioned git stash push.

This article helped me understand:

The command git stash is shorthand for git stash push. In this mode, non-option arguments are not allowed to prevent a misspelled subcommand from making an unwanted stash entry. There are also another alias for this command git stash save which is deprecated in favour of git stash push.

By default git ignores untracked files when doing stash. If those files need to be added to stash you can use -u options which tells git to include untracked files. Ignored files can be added as well if -a option is specified. -a will include both untracked and ignored files.

I care about naming my stashes, and I want them to include untracked files, so the command I most commonly run is: git stash push -u -m "whatIWantToNameThisStash"

Uranology answered 25/8, 2020 at 19:54 Comment(2)
See also this alias: https://mcmap.net/q/21263/-how-can-i-adjust-my-bash-function-such-that-i-can-omit-the-double-quotes/470749Uranology
In case you have lots of untracked files and you want to stash only some of them: git stash push path/to/some/file -uLimassol
A
20

As has been said elsewhere, the answer is to git add the file. e.g.:

git add path/to/untracked-file
git stash

However, the question is also raised in another answer: What if you don't really want to add the file? Well, as far as I can tell, you have to. And the following will NOT work:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

this will fail, as follows:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

So, what can you do? Well, you have to truly add the file, however, you can effectively un-add it later, with git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

And then you can continue working, in the same state as you were in before the git add (namely with an untracked file called path/to/untracked-file; plus any other changes you might have had to tracked files).

Another possibility for a workflow on this would be something like:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Note: As mentioned in a comment from @mancocapac, you may wish to add --exclude-standard to the git ls-files command (so, git ls-files -o --exclude-standard).]

... which could also be easily scripted -- even aliases would do (presented in zsh syntax; adjust as needed) [also, I shortened the filename so it all fits on the screen without scrolling in this answer; feel free to substitute an alternate filename of your choosing]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Note that the latter might be better as a shell script or function, to allow parameters to be supplied to git stash, in case you don't want pop but apply, and/or want to be able to specify a specific stash, rather than just taking the top one. Perhaps this (instead of the second alias, above) [whitespace stripped to fit without scrolling; re-add for increased legibility]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Note: In this form, you need to supply an action argument as well as the identifier if you're going to supply a stash identifier, e.g. unstashall apply stash@{1} or unstashall pop stash@{1}

Which of course you'd put in your .zshrc or equivalent to make exist long-term.

Hopefully this answer is helpful to someone, putting everything together all in one answer.

Antifouling answered 6/2, 2011 at 2:0 Comment(1)
git ls-files -o shows a lot more files than the ones i'm interested in. from the following git status I found adding --exclude-standard works. git ls-files -o --exclude-standard. My take on this is it only "includes" the untracked files you would normally not-ignore, i.e. only show untracked files your .gitignore wouldn't filter outMolybdenite
J
17

To include untracked files in the stash, you can use the --include-untracked or -u option with the git stash command.

git stash --include-untracked

or

git stash -u

Explanation:

When you run git stash while having uncommitted changes, including new files, Git will save your changes on a temporary stack called the stash. However, by default, git stash only saves tracked files. Any new, untracked files will not be included in the stash.

If you have added a new file to your repository and then run git stash, the stash operation will not save the new file. The new file will remain untracked in your working directory.

git stash --include-untracked or git stash -u will save both your modified tracked files and any untracked files in the stash, allowing you to retrieve them later using git stash apply or git stash pop.

Justle answered 24/5, 2023 at 5:29 Comment(2)
git stash -u thjen git stash pop results in error: could not restore untracked files from stash, if it needs to merge, i.e. it does not work and git lost data again :(Helluva
@Helluva it is working fine on my sideJustle
P
13

I was able to stash just the untracked files by doing:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

The last one pops the stash of the tracked files, thus leaving only the untracked files stashed.

Purport answered 6/5, 2017 at 22:33 Comment(2)
git stash save -u doesn't just save the untracked files, it saves both the tracked and untracked. I think the first save you are doing is not necessarcy in this case. There's a good diagram in atlassian.com/git/tutorials/saving-changes/…Rodie
The question is how to stash just the untracked files. If you skip the first stash, then what will you pop? The idea is to: 1) Stash tracked. 2) Stash untracked. 3) Pop tracked. Result: Untracked remains stashed.Purport
M
13

Just run this command in your project root directory:

git stash --include-untracked
Margaretamargarete answered 18/7, 2023 at 10:29 Comment(0)
A
8

Stashing is available in VS 2019 and later versions.

  1. Go to Git changes window Ctrl + Alt + F7
  2. Now press the drop down key near Commit All or Commit staged button to see the stashing options

enter image description here

If you want to stash untracked files like Git ignored files or Files which are not included into project then go for this option

enter image description here

Read this answer for full usage of Git stash in Visual studio: https://mcmap.net/q/11729/-is-it-possible-to-use-git-stash-command-from-visual-studio

Andi answered 11/11, 2021 at 14:41 Comment(0)
B
5

If you want to stash untracked files, but keep indexed files (the ones you're about to commit for example), just add -k (keep index) option to the -u

git stash -u -k
Barren answered 4/3, 2019 at 14:41 Comment(0)
C
4

let's suppose the new and untracked file is called: "views.json". if you want to change branch by stashing the state of your app, I generally type:

git add views.json

Then:

git stash

And it would be stashed. Then I can just change branch with

git checkout other-nice-branch
Cloven answered 18/11, 2018 at 21:40 Comment(0)
W
4

How do you stash an untracked file?

git stash --include-untracked
Waterworks answered 7/1, 2021 at 6:24 Comment(0)
T
3

You can simply do it with below command

git stash save --include-untracked

or

git stash save -u

For more about git stash Visit this post (Click Here)

Taiga answered 28/5, 2018 at 7:35 Comment(0)
L
1

I thought this could be solved by telling git that the file exists, rather than committing all of the contents of it to the staging area, and then call git stash. Araqnid describes how to do the former.

git add --intent-to-add path/to/untracked-file

or

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

However, the latter doesn't work:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Lyallpur answered 11/10, 2009 at 10:10 Comment(1)
As far as I can tell, the former doesn't work, either. See my answer for a solution to this problem.Antifouling
P
1

There are several correct answers here, but I wanted to point out that for new entire directories, 'git add path' will NOT work. So if you have a bunch of new files in untracked-path and do this:

git add untracked-path
git stash "temp stash"

this will stash with the following message:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

and if untracked-path is the only path you're stashing, the stash "temp stash" will be an empty stash. Correct way is to add the entire path, not just the directory name (i.e. end the path with a '/'):

git add untracked-path/
git stash "temp stash"
Pismire answered 19/8, 2014 at 23:59 Comment(1)
At least on my system your assumption is wrong. It works without the slash! Empty directories are ignored anyway. (macos git 2.6.2)Icelandic
F
1

I encountered a similar problem while using Sourcetree with newly created files (they wouldnt be included in the stash either).

When I first chose 'stage all' and then stash the newly added components where tracked and therefore included in the stash.

Forelock answered 8/5, 2020 at 8:11 Comment(0)
G
1

Use the following:

To stash the untracked files

git stash -u

To stash only tracked files/modified files

git stash

To get back the stashed changes

git stash pop

To see the list of stashed changes

git stash list

To apply the specific stashed change

git stash apply stash@{<stash_number>}

replace the <stash_number> with actual number which will be revealed after you run git stash list

Ghana answered 15/3 at 10:15 Comment(0)
L
-9

I used to ponder and desire the same feature. But over time, I noticed it really isn't needed. When you stash, it's OK to leave the new files. Nothing "bad" can happen to them (when you check out something else, git will error and not overwrite the existing untracked file)

And since usually the time frame between the git stash and the git stash pop is rather small, you'll be needing the untracked file quickly again. So I would say the inconvenience of the file showing up in git status while you're working on something else (between the git stash and the git stash pop) is smaller then the inconvenience caused by the work and needed attention it would otherwise cost to try to add the untracked file to your stash.

Latoyalatoye answered 18/2, 2011 at 9:12 Comment(6)
It depends on the project. Say the untracked file is a (half-written) unit test, and the testing harness runs all unit tests in the directory. Etc.Isisiskenderun
Another example is if you work on two computer, and you're allowed to move data from A to B, but not from B to A. If you create a new piece of code to solve an issue that first occurs on B but that you want on both A and B, you want to be able to stash the file on B so that when you recreate that file on A and then bring it over in a bundle, you can git diff the stashed version to verify that you didn't make a mistake.Magill
Just because a file isn't tracked in one branch, doesn't mean it won't conflict with a tracked file in another branch.Whiteheaded
simple counter-example: Configuration file in .conf.d directory, or any other that only by being there modifies the behavior of the software.Shipment
Of course the functionality is needed. It is, as an additional example, not possible to switch from one branch to another if you have locally untracked files that you wanted to stash.Melanous
My use case was rename and edit file. I realized my edit was getting too large for gits rename tracking. git stash -u, mv old new git commit -am "just move, git stash pop`Chemise

© 2022 - 2024 — McMap. All rights reserved.