Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stash changes while keeping the changes in the working directory in Git

Tags:

git

git-stash

People also ask

What happens when you stash changes git?

git stash temporarily shelves (or stashes) changes you've made to your working copy so you can work on something else, and then come back and re-apply them later on.

Does git stash save all changes?

Git stash saves the uncommitted changes locally, allowing you to make changes, switch branches, and perform other Git operations. You can then reapply the stashed changes when you need them. A stash is locally scoped and is not pushed to the remote by git push .

Where are git stash changes stored?

All are stored in . git/refs/stash . git stash saves stashes indefinitely, and all of them are listed by git stash list .

Why does git stash pop changes?

Why does git stash apply stage my changes? Anything that will affect your working tree (like a git checkout -- afile ) will first affect your index. the index is the middle-man for moving things from your work-tree to the object-store AND for moving things from the object-store to your work-tree.


For what it's worth, another way to do this is to stage the changes you want to keep, and then stash everything using --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

The commands above will stash everything, but it will leave the files staged in your working directory.

From the official Linux Kernel Git documentation for git stash or from git-scm:

If the --keep-index option is used, all changes already added to the index are left intact.


git stash and then git stash apply (git stash && git stash apply) will stash files and apply stash immediately after it. So after all you will have your changes in stash and in working dir.

You can create an alias if you want it in one piece. Just put something like this to ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

The drawback of this approach is that all files are stashed and recreated. This means that timestamps on the files in question will be changed. (Causing Emacs to complain when I try to save the file if opened it before I did the git sta, and may cause unnecessary rebuilds if you're using make or friends.)


A small enhancement in the answer which in practical may likely to use.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

You can use git stash create to create a stash commit, and then save it to the stash using git stash store:

git stash store $(git stash create) -m "Stash commit message"

This can be saved to a git alias to make it more convenient:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

Note that this does not do everything that git stash push does. For instance, it does not append the branch name to the commit, e.g. "stash@{0}: On myBranch: Stash commit message".


There's a trick may help you, not stash' thing but FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

And so now you have a commit tagged stash at your disposal, it's not possible to do a git stash pop anyway but you can do things like creating patch or resetting files etc. from there, your working dir files are also left intact BTW.