
When working with Git in real-world development environments, you often find yourself switching between tasks, fixing urgent bugs, reviewing code, or trying out experimental changes. These interruptions are common in agile teams and fast-paced software projects, where context switching is a daily reality. In such situations, committing unfinished work isn’t ideal, but leaving it untracked can be risky. This is where Git with stash becomes an essential part of your workflow.
git stash
allows developers to temporarily save their uncommitted changes without cluttering the project history, enabling them to quickly switch branches or handle high-priority issues without losing progress. This post explores how to use Git with stash effectively, covering core commands, best practices, and real-world examples that mirror common engineering tasks. Whether you’re a backend developer, frontend engineer, or full-stack contributor, mastering git stash
can help you work more efficiently and avoid costly mistakes.
What Is git stash
?
git stash
is a Git command that temporarily shelves—or “stashes”—changes in your working directory, allowing you to switch contexts without committing incomplete work. This is especially useful when you need to switch branches, pull updates, or respond to a high-priority task, but your current changes aren’t ready to be saved in the repository history. With Git with stash, your modifications are safely stored in a stack-like structure and can be reapplied at any time, exactly as they were when stashed.
Think of it as a clipboard for your uncommitted changes: you can cut them out of your current workspace, perform other tasks, and then paste them back in when you’re ready to resume. This makes this command a powerful tool for managing work-in-progress code without cluttering your commit history or risking data loss.
Why Use Git Stash?
In modern development environments, engineers are often pulled in multiple directions—juggling features, bug fixes, code reviews, and hotfixes. In such a fast-paced workflow, you need tools that offer flexibility without sacrificing stability. That’s where Git with stash becomes a valuable asset.
Here are several real-world scenarios where git with stash
proves invaluable:
🔄 1. Switching Tasks Mid-Feature
You’re halfway through building a new feature—perhaps you’ve written tests, updated a few components, and are partway through a refactor. Suddenly, a teammate flags a critical bug in production. Committing your unfinished code just to switch branches can pollute the project history. Instead, you run:
git stash
This safely sets your changes aside so you can handle the urgent issue, then come back and pick up where you left off.
🌿 2. Switching Branches Without Committing
Git doesn’t allow you to switch branches if you have changes that would conflict with the target branch. But sometimes, you’re just exploring a different part of the codebase or reviewing a teammate’s work.
Using git stash
, you can stash your current work:
git stash
git checkout another-branch
Once you’re done, you can return to your original branch and restore your work:
git checkout your-feature-branch
git stash pop
đź§Ş 3. Experimenting with Code Safely
Let’s say you’re exploring a new approach, unsure if it will work. Instead of making a messy commit or keeping temporary files around, stash your original state and start experimenting with a clean slate:
git stash -u
You can always return to your original work if the new direction doesn’t pan out.
đź“‹ 4. Keeping Work-in-Progress Out of the Commit History
Your current changes aren’t production-ready—maybe they break tests or aren’t complete—but you need to share your branch. Rather than committing WIP code or leaving dirty diffs behind, stash your changes before pushing or sharing your branch.
🔄 5. Avoiding Conflicts During Pulls or Rebases
Trying to pull or rebase with a dirty working directory can cause conflicts or disrupt local changes. Stashing your work first ensures a clean environment:
git stash
git pull --rebase
git stash pop
This allows you to keep your local changes intact while still syncing up with the latest updates from your team.
In all of these cases, Git with stash allows you to work more flexibly and confidently, without committing half-done work or risking data loss. It’s one of the most underrated productivity tools in a developer’s Git toolkit.
How to Use git stash
: Basic Commands
1. Stash Your Changes
git stash
This saves your tracked changes and reverts your working directory to the last commit.
2. Stash Including Untracked Files
git stash -u
The -u
flag includes untracked files (those not added via git add
) in the stash.
3. View Stash List
git stash list
You’ll see entries like:
stash@{0}: WIP on feature/login: 9fceb02 Add login validation
stash@{1}: WIP on main: a1b2c3d Fix navbar issue
4. Apply the Latest Stash
git stash apply
This re-applies the latest stashed changes but keeps them in the stash list.
5. Pop (Apply and Remove)
git stash pop
This re-applies the latest stash and removes it from the stash list.
6. Apply a Specific Stash
git stash apply stash@{1}
Useful when you have multiple stashes and need a specific one.
7. Drop or Clear Stashes
git stash drop stash@{0} # Removes one stash
git stash clear # Removes all stashes
Real-World Use Cases
đź› Scenario 1: Hotfix While Developing a Feature
You’re working on a new payment module:
git checkout -b feature/payment
# ... modify several files
Suddenly, a critical bug is reported on the main
branch.
git stash
git checkout main
git pull origin main
# fix the bug and commit
git checkout feature/payment
git stash pop
You’ve now fixed the bug and seamlessly returned to your feature branch with your changes intact.
đź§Ş Scenario 2: Trying Experimental Changes
You’re unsure about a new refactor:
# edit some files
git stash
# review or share a clean working directory
# or test something else
git stash pop
Using the stash lets you experiment freely without losing your original changes.
đź’Ľ Scenario 3: Switching Contexts in a Multi-Tasking Environment
You’re managing multiple features and need to juggle branches:
git stash -u
git checkout feature/onboarding
# handle updates or review PRs
git checkout feature/dashboard
git stash pop
Including untracked files (-u
) ensures you don’t lose draft files or logs not yet added to Git.
Best Practices for Using Git with Stash
- Always name your stash for clarity:
git stash save "WIP: refactor user model"
- Avoid long-term stashing: Stashes are meant to be temporary.
- Document your stash usage in team environments to avoid confusion.
- Use stash only when necessary—for more permanent work, consider creating a temporary branch.
Limitations to Keep in Mind
While Git with stash is a powerful tool for managing uncommitted changes, it’s not without its constraints. Understanding these limitations can help you use this command more effectively—and avoid surprises that could disrupt your workflow.
🌍 1. Not Branch-Specific
One of the most common misconceptions is that stashes are tied to branches. In reality, all stash entries are global, meaning they are not linked to any specific branch, even though the message in the stash log may reference the branch name where it was created.
This can lead to confusion if you’re juggling multiple branches and stashing frequently. For instance, you might stash changes on one branch, switch to another, and mistakenly apply the stash in the wrong context, causing conflicts or unexpected behaviour.
Tip: Always check your stash list with
git stash list
and consider naming stashes clearly usinggit stash save "WIP: feature/payment"
to avoid confusion.
đź§ľ 2. Not a Replacement for Commits
Although stashing is convenient, it’s important to remember that git stash
is not a substitute for proper version control practices. Stashes are designed for temporary use, not for tracking long-term progress.
Unlike commits, stash entries are not part of your project’s history, not shared with teammates by default, and can be accidentally cleared or overwritten. If you rely on this command to hold important work for an extended period, you risk losing it entirely.
Best Practice: If your work represents meaningful progress—even if it’s not complete—create a temporary branch and commit your changes there. Use
git with stash
only when truly necessary for short-term context switching.
⚠️ 3. Conflicts Can Occur When Applying a Stash
When you re-apply a stash using git stash apply
or git stash pop
, Git tries to merge the stashed changes into your current working directory. If the base files have changed since the stash was created (e.g., due to a merge, pull, or rebase), this can lead to merge conflicts.
Conflicts during stash application are often harder to resolve because the stashed changes are not tracked in the same way as commits. Git will flag the conflicting files, and you’ll need to manually resolve them.
Tip: Apply stashes as soon as reasonably possible, especially if you know the codebase is actively changing. The longer you wait, the higher the risk of conflict.
đź§ą 4. Stashes Can Be Lost or Overwritten
Stashes are stored in a stack, and by default, git stash
does not warn you if you’re about to overwrite an existing stash entry. Additionally, running git stash clear
removes all stashes irreversibly.
This means you can accidentally lose valuable work if you don’t manage stashes carefully.
Pro Tip: Use
git stash show -p stash@{n}
to inspect a stash before applying it. And if you’re unsure, back it up by creating a branch from it:git stash branch backup-branch-name stash@{n}
đź§© 5. Limited Visibility and Collaboration
Because stashes aren’t part of your repository history and aren’t shared when you push to a remote, teammates won’t see your stashed work. This can be problematic in collaborative environments where visibility and traceability are critical.
If you’re working on a team and need to temporarily pause progress, it’s usually better to create a WIP commit on a shared branch, or push to a dedicated temporary branch.
Conclusion
Using Git with stash effectively can significantly streamline your development workflow, particularly in fast-moving environments where context switching is frequent. Whether you’re jumping between feature development and urgent hotfixes, collaborating on multiple branches, or experimenting with new ideas, git with stash
provides a lightweight, reliable way to pause and resume work without losing momentum.
It acts as a temporary buffer—a kind of safety net—for your in-progress changes. Instead of committing half-finished code just to avoid losing it, or juggling temporary files outside Git, you can stash your changes and return to them when the time is right. This flexibility empowers you to stay organized, avoid messy commit histories, and respond quickly to shifting priorities.
More than just a convenience, mastering Git with stash reflects a mature approach to version control. It helps you:
- Keep your project history clean and meaningful
- Isolate experimental or incomplete work from stable code
- Minimize conflicts and distractions when switching tasks
- Improve focus by maintaining a clean workspace
In team-based or high-velocity environments, these small advantages compound into major productivity gains. And while git stash
is no substitute for proper branching and commit strategies; it’s an excellent complement to them—a tactical tool that fills the gaps when traditional workflows fall short.
Ultimately, learning when and how to use git with stash
isn’t just about knowing another Git command—it’s about becoming a more adaptable, thoughtful, and efficient engineer.
FAQs
1. What is git stash
and why should I use it?
git stash
allows you to temporarily save uncommitted changes without committing them. It’s useful when you need to switch tasks or branches quickly, fix bugs, or update your local branch without losing your progress.
2. Does git stash
save untracked files?
By default, git stash
only saves tracked changes. To include untracked files, use:
git stash -u
Or, for untracked and ignored files:
git stash -a
3. How do I apply a stash after switching branches?
You can apply the latest stash with:
git stash apply
Or a specific stash with:
git stash apply stash@{1}
Use git stash pop
if you want to apply and remove the stash in one step.
4. What’s the difference between git stash apply
and git stash pop
?
git stash apply
: Re-applies the stash but keeps it in the stash list.git stash pop
: Re-applies the stash and removes it from the list.
Use apply
if you may need the same stash again; use pop
to keep your stash list clean.
5. How can I see what’s inside a stash?
Use the following to view changes:
git stash show -p stash@{0}
This displays a full diff of the stashed changes.
6. Can I stash only certain files?
Yes. Use the --patch
flag:
git stash -p
This allows you to interactively choose which changes to stash.
7. Is git stash branch-specific?
No, stashes are global. Even though Git shows the branch in the stash message, any stash can be applied on any branch. Be cautious—applying a stash on the wrong branch can cause conflicts.
8. Can I recover a stash I accidentally popped or cleared?
If you’ve used git stash pop
, the stash is removed after applying. Recovery is difficult unless you have the stash’s reference (e.g., from the reflog). Always double-check before dropping or clearing stashes.
9. How do I delete a specific stash?
Use:
git stash drop stash@{1}
To delete all stashes:
git stash clear
10. Can I create a branch from a stash?
Yes. This is useful if you want to keep your stashed work separate from the current branch:
git stash branch new-branch-name
This command creates a new branch, checks it out, and applies the stash.
Was this helpful?
0 / 0