Why isn't the git stash unique per branch?
As mentioned, if you want a “per-branch stash,” you really want a new branch forking off from the existing branch.
Also, besides the already mentioned fact that the stash allows you to pull into a branch that you’re working on, it also allows you to switch branches before you have committed everything. This is useful not for cherry-picking in the usual sense so much as for cherry-picking your working copy.
F.ex., while working on a feature branch, I will often notice minor bugs or cosmetic impurities in the code that aren’t relevant to that branch. Well, I just fix those right away. When time comes to commit, I selectively commit the relevant changes but not the fixes and cosmetics. Instead I stash those, which allows me to switch to my minor-fixes-on-stable branch, where I can then apply the stash and commit each minor fix separately. (Depending on the changes in question, I will also stash some of them yet again, to switch to a different feature branch, where I apply those.)
This allows me to go deep into programming mode when I am working, and not worry about proper librarianship of my code. Then when I take a mental break, I can go back and carefully sort my changes into all the right shelves.
If the stash weren’t global, this type of workflow would be far more difficult to do.
As of Git 1.6, you can now apply stashes to branches using
git stash branch name_of_new_branch
Git will create the new branch for you, and check it out! For more information, see
the git book
info git-stash
and search on option=branch
.
I'm guessing you can move stashes around using
git stash branch <branch | new_branch> [<stash>]
and to see a list of your stashes, use
git stash list
Reference
if you want a "stash" that runs off a branch do something like this to store your changes on a new branch off your current branch.
git checkout -b new_stash
git commit -a -m "stashed changes"
to undo the stash
git reset HEAD^
git branch -d new_stash
git stash is especially useful because you can pull changes into a dirty tree, i.e. if you have outstanding edits and want to do a
git pull
and you can't, you can stash your changes, pull and then apply the stash
git stash
git pull
git stash apply
git stash clear
hope this helped!
git-stash is most useful to me to move not-yet-checked-in changes off to a different branch than the one that is currently checked out.
For example - I often find myself doing simple changes on a bug-fixes branch; only to find that a change I'm working on is more complex than I first guessed. Git-stash is the easiest way to move that set of changes to a different branch.