Learning Notes #84 β A Deep Dive into Stashing and Its Hacks
Introduction
Git is an essential tool for version control, and one of its underrated but powerful features is git stash
. It allows developers to temporarily save their uncommitted changes without committing them, enabling a smooth workflow when switching branches or handling urgent bug fixes.
In this blog, we will explore git stash
, its varieties, and some clever hacks to make the most of it.
1. Understanding Git Stash
Git stash allows developers to temporarily save changes made to the working directory, enabling them to switch contexts without having to commit incomplete work. This is particularly useful when you need to switch branches quickly or when you are interrupted by an urgent task.
When you run git stash
, Git takes the uncommitted changes in your working directory (both staged and unstaged) and saves them on a stack called βstash stackβ. This action reverts your working directory to the last committed state while safely storing the changes for later use.
How It Works
- Git saves the current state of the working directory and the index (staging area) as a stash.
- The stash includes modifications to tracked files, newly created files, and changes in the index.
- Untracked files are not stashed by default unless specified.
- Stashes are stored in a stack, with the most recent stash on top.
Common Use Cases
- Context Switching: When you are working on a feature and need to switch branches for an urgent bug fix.
- Code Review Feedback: If you receive feedback and need to make changes but are in the middle of another task.
- Cleanup Before Commit: To stash temporary debugging changes or print statements before making a clean commit.
Git stash is used to save uncommitted changes in a temporary area, allowing you to switch branches or work on something else without committing incomplete work.
Basic Usage
The basic git stash
command saves all modified tracked files and staged changes. This does not include untracked files by default.
git stash
This command performs three main actions
- Saves changes: Takes the current working directory state and index and saves it as a new stash entry.
- Resets working directory: Reverts the working directory to match the last commit.
- Stacks the stash: Stores the saved state on top of the stash stack.
Restoring Changes
To restore the stashed changes, you can use
git stash pop
This does two things
- Applies the stash: Reapplies the changes to your working directory.
- Deletes the stash: Removes the stash entry from the stash stack.
If you want to keep the stash for future use
git stash apply
This reapplies the changes without deleting the stash entry.
Viewing and Managing Stashes
To see a list of all stash entries
git stash list
This shows a list like
stash@{0}: WIP on feature-branch: 1234567 Commit message stash@{1}: WIP on master: 89abcdef Commit message
Each stash is identified by an index (e.g., stash@{0}
) which can be used for other stash commands.
git stash
This command stashes both tracked and untracked changes.
To apply the last stashed changes back
git stash pop
This applies the stash and removes it from the stash list.
To apply the stash without removing it
git stash apply
To see a list of all stashed changes
git stash list
To remove a specific stash
git stash drop stash@{index}
To clear all stashes
git stash clear
2. Varieties of Git Stash
a) Stashing Untracked Files
By default, git stash
does not include untracked files. To include them
git stash -u
Or:
git stash --include-untracked
b) Stashing Ignored Files
To stash even ignored files
git stash -a
Or:
git stash --all
c) Stashing with a Message
To add a meaningful message to a stash
git stash push -m "WIP: Refactoring user authentication"
d) Stashing Specific Files
If you only want to stash specific files
git stash push -m "Partial stash" -- path/to/file
e) Stashing and Switching Branches
Instead of running git stash
and git checkout
separately, do it in one step
git stash push -m "WIP: Bug Fix" && git checkout other-branch
3. Advanced Stash Hacks
a) Viewing Stashed Changes
To see the contents of a stash before applying
git stash show -p stash@{0}
b) Applying a Stash to a Different Branch
You can stash on one branch and apply it to another
git checkout other-branch git stash apply stash@{0}
c) Creating a New Branch from a Stash
If you realize your stash should have been a separate branch
git stash branch new-branch stash@{0}
This will create a new branch and apply the stashed changes.
d) Keeping Index Changes
If you want to keep staged files untouched while stashing
git stash push --keep-index
e) Recovering a Dropped Stash
If you accidentally dropped a stash, it may still be in the reflog
git fsck --lost-found
Or, check stash history with:
git reflog stash
f) Using Stash for Conflict Resolution
If youβre rebasing and hit conflicts, stash helps in saving progress
git stash # Fix conflicts # Continue rebase git stash pop
4. When Not to Use Git Stash
- If your work is significant, commit it instead of stashing.
- Avoid excessive stashing as it can lead to forgotten changes.
- Stashing doesnβt track renamed or deleted files effectively.
Git stash is an essential tool for developers to manage temporary changes efficiently. With the different stash varieties and hacks, you can enhance your workflow and avoid unnecessary commits. Mastering these techniques will save you time and improve your productivity in version control.
Happy coding!