In the Basics of Git course, I was in the middle of making some changes to the homepage of our sample site when a another change request came in. I needed to quickly save--or stash away--my changes and then apply them back to the repository later, after my other work was complete.
In the Up and Runningn with Git course, I was in the middle of making some changes to the homepage of our sample site when a another change request came in. I needed to quickly save — or stash away — my changes and then apply them back to the repository later, after my other work was complete.
The easiest way to do this is with git-stash
, a useful git command that allows you to store the modifications you’ve made in our working directory and go back to a clean working directory.
From the Git Manual (run git stash --help
to see it on your own):
Use git stash when you want to record the current state of the working directory and the index, but want to go back to a clean working directory. The command saves your local modifications away and reverts the working directory to match the HEAD commit.
Git stash isn’t a replacement for smart use of branches (we don’t want to start a new feature in a main branch and then stash it away until you’re ready to apply it) but can be a life saver if we find ourselves needing to quickly shifting gears to another task, bug report, or request.
Fire up a current project to try out git stash.
First, let’s check if we have any existing stashes.
git stash list
The list
option shows all of the existing stashes, if there are any. If you do have some they’ll be listed like this:
stash@{0}: On develop: testing out git stash
stash@{1}: WIP on master: 4fd1101 fixing layout on homepage product listing
stash@{2}: On develop: product bundle download template
Each stash is listed in a separate line, starting with the stash name that consists of the word “stash” and an index (starting with zero) in curly braces. The latest stash is the one at the top, with the index of zero (confusing, right?).
Let’s add a stash. To do that we use the stash save
command.
stash save "updated the offline file"
The last two parts of that stash command are optional. We can just do:
stash
instead and it will still create a stash with any changes in the working directory but without are customized message. The save
option is automatically assumed if it isn’t included.
Here’s the list of stashes now:
stash@{0}: On develop: updated the offline file
stash@{1}: On develop: testing out git stash
stash@{2}: WIP on master: 4fd1101 fixing layout on homepage product listing
stash@{3}: On develop: product bundle download template
To apply a stash to the working directory, we have a couple of options. The first is:
git stash pop
which will remove the most recent stash from the list and apply it to the current working directory. It’s just reversing what you did when saving the stash (but keeping any subsequent repository changes intact).
You can also be specific and pop any stash in the list:
git stash pop stash@{1}
We should see something like this at the end of the output:
Dropped stash@{0} (38f88c1479dc8a3c63f794feed7cd276ae3c6c7e)
The other option when applying a stash is to use:
git stash apply
Just like with pop
, we can choose to not specify a stash and it will use the latest. Or, we can specify one, like this:
git stash apply stash@{1}
With apply
, we’ll get similar output when applying the stash, but without the message that the stash was dropped. Why? Because git stash apply
applies the stash we specified but it doesn’t drop it from the list of stashes.
If we run:
git stash list
We get the full list of stashes, including the one we just applied.
stash@{0}: On develop: updated the offline file
stash@{1}: On develop: testing out git stash
stash@{2}: WIP on master: 4fd1101 fixing layout on homepage product listing
stash@{3}: On develop: product bundle download template
These are the basic commands when using stashes day-to-day. There’s more to it, and I encourage you to run:
git stash --help
to see all of the commands.