Reputation: 8737
Is there a git stash
command that stashes your changes, but keeps them in the working directory too? So basically a git stash; git stash apply
in one step?
Upvotes: 297
Views: 87587
Reputation: 1246
There's a trick may help you, not stash' thing but FWIW:
git commit -m "Your already staged content (May be empty)" #(Commit index)
git add -A #(stage remaining 'unstaged' contents)
git commit -m "My works so far (Unstaged)" #(Working directory)
git tag stash #(mark the commit with 'stash' tag)
git reset HEAD^ #(1st reset (--mixed): Unstaged)
git reset --soft HEAD^ #(2nd reset (--soft): Staged (Skip if your index was empty))
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 the created 'stash' tag, your working dir files are also left intact BTW.
If you prefer to store in a branch:
current_branch=`git branch --show-current`
git checkout -b stash #(create and switch to new branch 'stash')
git commit -m "Your already staged content (May be empty)" #(Commit index)
git add -A #(stage remaining 'unstaged' contents)
git commit -m "My works so far (Unstaged)" #(Working directory)
git reset HEAD^ #(1st reset (--mixed): Unstaged)
git reset --soft $current_branch #(2nd reset (--soft): Staged)
git checkout $current_branch #(Now go back to where you've left with your working dir and staged status intact)
Upvotes: 3
Reputation:
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.
Upvotes: 288
Reputation: 21074
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
".
Upvotes: 33
Reputation: 33384
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.)
Upvotes: 95
Reputation: 14272
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"
Upvotes: 16