git stash: Save and Restore Uncommitted Changes
When you are in the middle of a feature and need to switch branches to fix a bug or review someone else’s work, you have a problem: your changes are not ready to commit, but you cannot switch branches with a dirty working tree. git stash solves this by saving your uncommitted changes to a temporary stack so you can restore them later.
This guide explains how to use git stash to save, list, apply, and delete stashed changes.
Basic Usage
The simplest form saves all modifications to tracked files and reverts the working tree to match the last commit:
git stashSaved working directory and index state WIP on main: abc1234 Add login page
Your working tree is now clean. You can switch branches, pull updates, or apply a hotfix. When you are ready to return to your work, restore the stash.
By default, git stash saves both staged and unstaged changes to tracked files. It does not save untracked or ignored files unless you explicitly include them (see below).
Stashing with a Message
A plain git stash entry shows the branch and last commit message, which becomes hard to read when you have multiple stashes. Use -m to attach a descriptive label:
git stash push -m "WIP: user authentication form"This makes it easy to identify the right stash when you list them later.
Listing Stashes
To see all saved stashes, run:
git stash liststash@{0}: On main: WIP: user authentication form
stash@{1}: WIP on main: abc1234 Add login page
Stashes are indexed from newest (stash@{0}) to oldest. The index is used when you want to apply or drop a specific stash.
To inspect the contents of a stash before applying it, use git stash show:
git stash show stash@{0}Add -p to see the full diff:
git stash show -p stash@{0}Applying Stashes
There are two ways to restore a stash.
git stash pop applies the most recent stash and removes it from the stash list:
git stash popgit stash apply applies a stash but keeps it in the list so you can apply it again or to another branch:
git stash applyTo apply a specific stash by index, pass the stash reference:
git stash apply stash@{1}If applying the stash causes conflicts, resolve them the same way you would resolve a merge conflict, then stage the resolved files.
Stashing Untracked and Ignored Files
By default, git stash only saves changes to files that Git already tracks. New files you have not yet staged are left behind.
Use -u (or --include-untracked) to include untracked files:
git stash -uTo include both untracked and ignored files — for example, generated build artifacts or local config files — use -a (or --all):
git stash -aPartial Stash
If you only want to stash some of your changes and leave others in the working tree, use the -p (or --patch) flag to interactively select which hunks to stash:
git stash -pGit will step through each changed hunk and ask whether to stash it. Type y to stash the hunk, n to leave it, or ? for a full list of options.
Creating a Branch from a Stash
If you have been working on a stash for a while and the branch has diverged enough to cause conflicts on apply, you can create a new branch from the stash directly:
git stash branch new-branch-nameThis creates a new branch, checks it out at the commit where the stash was originally made, applies the stash, and drops it from the list if it applied cleanly. It is the safest way to resume stashed work that has grown out of sync with the base branch.
Deleting Stashes
To remove a specific stash once you no longer need it:
git stash drop stash@{0}To delete all stashes at once:
git stash clearUse clear with care — there is no undo.
Quick Reference
For a printable quick reference, see the Git cheatsheet .
| Command | Description |
|---|---|
git stash |
Stash staged and unstaged changes |
git stash push -m "message" |
Stash with a descriptive label |
git stash -u |
Include untracked files |
git stash -a |
Include untracked and ignored files |
git stash -p |
Interactively choose what to stash |
git stash list |
List all stashes |
git stash show stash@{0} |
Show changed files in a stash |
git stash show -p stash@{0} |
Show full diff of a stash |
git stash pop |
Apply and remove the latest stash |
git stash apply stash@{0} |
Apply a stash without removing it |
git stash branch branch-name |
Create a branch from the latest stash |
git stash drop stash@{0} |
Delete a specific stash |
git stash clear |
Delete all stashes |
FAQ
What is the difference between git stash pop and git stash apply?pop applies the stash and removes it from the stash list. apply restores the changes but keeps the stash entry so you can apply it again — for example, to multiple branches. Use pop for normal day-to-day use and apply when you need to reuse the stash.
Does git stash save untracked files?
No, not by default. Run git stash -u to include untracked files, or git stash -a to also include files that match your .gitignore
patterns.
Can I stash only specific files?
Yes. In modern Git, you can pass pathspecs to git stash push, for example: git stash push -m "label" -- path/to/file. If you need a more portable workflow, use git stash -p to interactively select which hunks to stash.
How do I recover a dropped stash?
If you accidentally ran git stash drop or git stash clear, the underlying commit may still exist for a while. Run git fsck --no-reflogs | grep "dangling commit" to list unreachable commits, then git show <hash> to inspect them. If you find the right stash commit, you can recreate it with git stash store -m "recovered stash" <hash> and then apply it normally.
Can I apply a stash to a different branch?
Yes. Switch to the target branch with git switch branch-name, then run git stash apply stash@{0}. If there are no conflicts, the changes are applied cleanly. If the branches have diverged significantly, consider git stash branch to create a fresh branch from the stash instead.
Conclusion
git stash is the cleanest way to set aside incomplete work without creating a throwaway commit. Use git stash push -m to keep your stash list readable, prefer pop for one-time restores, and use git stash branch when applying becomes messy. For a broader overview of Git workflows, see the Git cheatsheet
or the git revert guide
.






