How can I stash a specific file leaving the others currently modified out of the stash I am about to save?
For example, if git status gives me this:
younker % gst # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: app/controllers/cart_controller.php # modified: app/views/cart/welcome.thtml # no changes added to commit (use "git add" and/or "git commit -a")
and I only want to stash app/views/cart/welcome.thtml, how would I do that? Something like (but of course this does not work):
git stash save welcome_cart app/views/cart/welcome.thtml
EDIT: Since git 2.13, there is a command to save a specific path to the stash:
git stash push <path>. For example:
git stash push -m welcome_cart app/views/cart/welcome.thtml
You can do that using
git stash --patch (or
git stash -p) — you’ll enter interactive mode where you’ll be presented with each hunk that was changed. Use
n to skip the files that you don’t want to stash,
y when you encounter the one that you want to stash, and
q to quit and leave the remaining hunks unstashed.
a will stash the shown hunk and the rest of the hunks in that file.
Not the most user-friendly approach, but it gets the work done if you really need it.
I usually add to index changes I don’t want to stash and then stash with
git add app/controllers/cart_controller.php git stash --keep-index git reset
The last step is optional, but usually, you want it. It removes changes from the index.
As noted in the comments,
git stash --keep-index pushes everything onto the stash, both staged and unstaged. The
--keep-index just leaves the index alone after the stash is done. This can cause merge conflicts when you later pop the stash.
To add to svick’s answer, the
-m option simply adds a message to your stash, and is entirely optional. Thus, the command
git stash push [paths you wish to stash]
is perfectly valid. So for instance, if I want to only stash changes in the
src/ directory, I can just run
git stash push src/