Git Stash
Git’s Stash feature is consistently under used, which is strange because is also one of Git’s features that makes it ridiculously awesome.
Hers’s how it works:
UseCase:
You start working on an issue or feature and have made changes to one or many files in working towards a commit. But before you finish it, you notice that there is an emergency fix you have to make on another issue, or you realize that you have to take up another task before you can commit your current one.
You could in this case just start working on the new task and then carefully stage files for it without including changes from your work for the previous task, but not only is this sloppy, but it is also unlikely to work.
In a case like this, you can just “stash” away the work you have done on your first task and be left with a clean tree to start work on the second.
The Normal Way
All you have to do is go
git stash
You’ll see a return message like
Saved working directory and index state WIP on master: 38fcd98 LAST_COMMIT
HEAD is now at 38fcd98 LAST_COMMIT
done.
To see your saved stash, go
git stash list
You should see a list like
stash@{0}: WIP on master: 38fcd98 LAST_COMMIT
stash@{1}: On master: Stashed Feature X
As you can see, stashes are stacked with the newest ones being on the top.
Once you have tackled the new issue and want to go back to your original work, you want to “apply” your stash by going
git stash apply
This will automatically recover the stash at the top of the pile. But this is not what you always want. You might want to recover a stash from way down the stack. In such a case, just go
git stash apply stash@{1}
The Better Way
When you just got ‘git stash’, the stash message is auto-created making it not very descriptive. So when your stash stack is up to say, 20 commit objects, it might be hard to tell what’s really inside one. You can always go
git stash show stash@{1}
to look inside a stash, but this is not always the quickest way. To tackle this problem, be sure to give your stashes names by going
git stash save "Work on #553"
Now when you go ‘git list’, you’ll see
stash@{0}: On master: Work on #553
stash@{1}: On master: Work on #550
stash@{2}: WIP on master: 38fcd98 LAST_COMMIT
stash@{3}: On master: HELLOsetcap CAP_NET_RAW+eip CAP_NET_ADMIN+eip /usr/bin/dumpcap
As you can see, its a lot easier to tell what might be in the first two stashes here than the last two.
Anyway, also be sure to go
man git stash
as usual, to discover many more cool features of stash.