Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Saving Half-Done Work With Git Stash

DZone's Guide to

Saving Half-Done Work With Git Stash

Git stash allows you to save work in progress, which is handy for quickly switching contexts, without committing half-done work.

· DevOps Zone ·
Free Resource

Learn more about how DevOps teams must adopt a more agile development process, working in parallel instead of waiting on other teams to finish their components or for resources to become available, brought to you in partnership with CA Technologies.

Imagine that you are working on a part of a project and it starts getting messy. There is an urgent bug that needs your immediate attention. It is time to save your changes and switch branches. The problem is, you don't want commit half-done work. The solution is git stash.

Stashing is handy if you need to quickly switch context and work on something else but you're mid-way through a code change and aren't quite ready to commit. — Bitbucket

Stashing

Let's say you currently have a couple of local modifications. Run  git status to check your current state:

$ git status 
# On branch master 
# Changes to be committed: 
#  (use "git reset HEAD <file>..." to unstage) 
#    modified: index.html 
# Changes not staged for commit: 
#  (use "git add <file>..." to update what will be committed) 
#    modified: assets/stylesheets/styles.css 

We need to work on that urgent bug. First, we want to save out unfinished work changes without committing them. This is where git stash comes in handy:

$ git stash 
Saved working directory and index state WIP on master: 
 bb06da6 Modified the index page 
HEAD is now at bb06da6 Modified the index page 
(To restore them type "git stash apply") 

Your working directory is now clean and all uncommitted local changes have been saved! At this point, you're free to make new changes, create new commits, switch branches, and perform any other Git operations.

By default, stashes are identified as "WIP," work in progress, on top of the branch and commit they are created from.

Re-applying Your Stash

Git stash is a temporary storage. When you're ready to continue where you left off, you can restore the saved state easily: git stash pop.

Popping your stash removes the changes from your stash and reapplies the last saved state. If you want to keep the changes in the stash as well, you can use git stash apply instead.

Additional Tips and Tricks

There are a couple of other things you can do with a stash. Let's take a look!

Try this out by adding CSS-line hight to your styles and stash it with a nice comment.

  • Stashing untracked files: This is the only way to save untracked files: $ git stash -u or $ git stash --include-untracked
  • List multiple stashes: When you git stash or git stash save, Git will create a Git commit object with a name and then save it in your repo. You can view the list of stashes you made at any time! $ git stash list.
$ git stash list 
stash@{0}: On master: Modified the index page
stash@{1}: WIP on master: bb06da6 Initial Commit
  • Partial stashes: You can choose to stash just a single file, a collection of files, or individual changes from within files: $ git stash -p or $ git stash --patch.
    • RSpec tests are a must in the Ruby on Rails projects, but they might not be always complete. Stash only the part that is ready to go!
  • Viewing stash diffs There are two ways to view a stash: to view the full diff of a stash - $ git stash show -p  or view only the latest stash -  $ git stash show .
$ git stash show 
index.html | 1 + 
style.css | 2 ++ 
2 files changed, 3 insertions(+)
  • Creating a branch from the stash: Create a new branch to apply your stashed changes to, and then pop your stashed changes onto it: $ git stash branch <branch_name> <stash_id>.
  • Remove your stash: Use with caution, as it can be difficult to revert. The only way to revert it is if you didn't close the terminal after deleting the stash.
    If you no longer need a particular stash, you can delete it with: $ git stash drop <stash_id>. Or you can delete all of your stashes from the repo with: $ git stash clear.

Hope this article helped you to get a better understanding how stashing works. Be sure to test it out!

Discover the warning signs of DevOps Dysfunction and learn how to get back on the right track, brought to you in partnership with CA Technologies.

Topics:
git ,git stash ,web design and web development ,web dev

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}