I am trying to apply changes I stashed earlier with git stash pop
and get the message:
Cannot apply to a dirty working tree, please stage your changes
Any suggestion on how to deal with that?
I am trying to apply changes I stashed earlier with git stash pop
and get the message:
Cannot apply to a dirty working tree, please stage your changes
Any suggestion on how to deal with that?
When I have to apply stashed changes to a dirty working copy, e.g. pop more than one changeset from the stash, I use the following:
$ git stash show -p | git apply -3 && git stash drop
Basically it
I wonder why there is no -f
(force) option for git stash pop
which should exactly behave like the one-liner above.
In the meantime you might want to add this one-liner as a git alias:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Thanks to @SamHasler for pointing out the -3
parameter which allows to resolve conflicts directly via 3-way merge.
I do it in this way:
git add -A
git stash apply
and then (optionaly):
git reset
You can do this without having to stash your current changes by exporting the stash you want as a patch file and manually applying it.
For example, say you want to apply stash@{0} to a dirty tree:
Export stash@{0} as a patch:
git stash show -p stash@{0} > Stash0.patch
Manually apply the changes:
git apply Stash0.patch
If the second step fails, you will have to edit the Stash0.patch file to fix any errors and then try git apply again.
Either clean your working directory with git reset, commit the changes, or, if you want to stash the current changes, try:
$ git stash save "description of current changes" $ git stash pop stash@{1}
This will stash the current changes, and then pop the second stash from the stash stack.
Mathias's solution is definitely the closest to a git stash pop --force (and really, c'mon Git devs, let's get this option already!)
However, if you want to do the same thing using only git commands, you can:
In other words, make a commit (which we will never push) of your current changes. Now that your workspace is clean, pop your stash. Now, commit the stash changes as an amendment to your previous commit. Having done that you now have both sets of changes combined in a single commit ("Fixme"); just reset (--soft NOT --hard so nothing is actually lost) your checkout to "one before that commit", and now you have both sets of changes, completely uncommitted.
**EDIT**
I just realized it's actually even easier; you can completely skip step 3, so ...
(Commit current changes, pop off the stashed changes, reset that first commit to get both sets of changes combined in an uncommitted state.)
None of these answers actually work if you find yourself in this situation as I did today. Regardless of how many git reset --hard
's I did, it got me nowhere. My answer (not official by any means was):
git reflog --all
I also found Mathias Leppich's solution to work great so I added an alias for it to my global .gitconfig
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Now I can just type
git apply-stash-to-dirty-working-tree
which works great for me.
(Your mileage may vary on this long alias name. But I like a dose of verbosity when it comes with bash completion.)
You can apply a stash to a "dirty" tree by doing a git add
to stage any changes you've made, thus cleaning up the tree. Then you can git stash pop
and apply the stashed changes, no problem.
You have files that have been modified but not committed. Either:
git reset --hard HEAD (to bring everything back to HEAD)
or, if you want to save your changes:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
I had the same problem but git had zero changed files. Turns out I had a index.lock file that was lying around. Deleting it solved the problem.
I was unable to get most of these to work; for some reason it always thinks I have local changes to a file. I can't apply a stash, patches won't apply, checkout
and reset --hard
fail. What finally worked was saving the stash as a branch with git stash branch tempbranchname
, and then doing a normal branch merge: git checkout master
and git merge tempbranchname
.
From http://git-scm.com/book/en/Git-Tools-Stashing :
If you want an easier way to test the stashed changes again, you can run git stash branch, which creates a new branch for you, checks out the commit you were on when you stashed your work, reapplies your work there, and then drops the stash if it applies successfully