Update 2012-05-02 - Add new use-case when merging from trunk.
One thing I like in git is the
stash command. Basically what it's
to take out current changes that we have, store it in temporary place and then
revert our repo to it's previous pristine state. This has a number of use cases.
Let say you're working on some features and then got some bug report that need
to be fixed quickly. You may do new checkout in other location and do the bug
fixing work, commit it and then continue on your new features work. This may not
really prevalent if you work in branch since the bug might need to be fixed in
git branch does the job here since it allow you to
Now back to us who still stuck with svn. Nothing wrong with svn, it does
and 99% of the time we're happy with it. There's another use case than I mentioned
just now. Supposed while working on the new features, you found a bug. It may be
just 1 line fix and you don't want the fix end up with features you're working on
currently. With svn, you have few options:-
- Do new checkout in another directory, fix the bug and commit.
svn diff > tmp.diff,
svn revert -R ., fix the bug and commit,
patch -p0 < tmp.diff
Second option not really nice solution if you have lot of newly added
you want to have clean environment in order to test the bug fixes. You have to
manually copy all the files to some other place. So I search around for 'svn stash'
and luckily there's few others who'd also thinking about 'svn stash'. There's one
that look complete, from a guy named scott (can't find any more details) so I
give it a try. The script work quite well, it named as
svn, just put
$PATH, make sure it come first before the usual path such
/usr/local/bin. The script basically a wrapper to actually svn
it contains few additonal commands and if none match, it just forward that to the real svn.
Scott's blog have enough explanation on how to use the script so I won't
here. Basically the flow are:-
- ... fix bug etc
svn stash list
svn stash popor
svn stash apply <stash-name>- pop will remove the stash while
applywill keep it.
Another useful use-case is when working on branch. While in the middle
of your work on the branch, you might want to merge latest changes from
trunk. It always good practice to merge into a clean working directory
rather than have the changes from merge mix your current uncommitted
work. You may not ready yet to commit your current changes. With
command you can 'stash' the current changes, merge latest changes from
trunk, commit, reapply the stash and continue to work:-
kamal@sms:~/marimore_sms/branches/381-reset-count $ svn status M lib/py/mamoprivate/sms/__init__.py M bin/sendsmsd kamal@sms:~/marimore_sms/branches/381-reset-count $ svn stash Reverted 'lib/py/mamoprivate/sms/__init__.py' Reverted 'bin/sendsmsd' Changes stashed as: "4d51a3eb-3a16-4e63-89e7-09e74cd30d91" Working copy reverted to 129 kamal@sms:~/marimore_sms/branches/381-reset-count $ svn status kamal@sms:~/marimore_sms/branches/381-reset-count $ svn merge ../../trunk/ --- Merging r129 through r132 into '.': U lib/py/mamoprivate/d/projects/sms/settings.py M lib/py/mamoprivate/d/projects/sms/settings.py kamal@sms:~/marimore_sms/branches/381-reset-count $ svn ci -m 'merge latest trunk, refs #381' Sending 381-reset-count Sending 381-reset-count/lib/py/mamoprivate/d/projects/sms/settings.py Transmitting file data . Committed revision 133. kamal@sms:~/marimore_sms/branches/381-reset-count $ svn stash list 1637 2012-05-02 13:56 4d51a3eb-3a16-4e63-89e7-09e74cd30d91 kamal@sms:~/marimore_sms/branches/381-reset-count $ svn stash pop 4d51a3eb-3a16-4e63-89e7-09e74cd30d91 pop: 4d51a3eb-3a16-4e63-89e7-09e74cd30d91 Unstaging stash "4d51a3eb-3a16-4e63-89e7-09e74cd30d91". M lib/py/mamoprivate/sms/__init__.py M bin/sendsmsd Stash "4d51a3eb-3a16-4e63-89e7-09e74cd30d91" removed. kamal@sms:~/marimore_sms/branches/381-reset-count $ svn status M lib/py/mamoprivate/sms/__init__.py M bin/sendsmsd
It also have some other goodies but I haven't try any of them. The
script also show
a creative way to provide 'plugins' to a command that do not natively support plugin.
I might apply the same technique to other command. I have in mind to override the
svn commit command to provide some kind pre-commit hook that run the code through
static code checker before commiting. We're using Unfuddle so no chance for us to use
the native svn pre-commit hook. Lastly, thanks to scott for such useful script.