I\'ve been using TFS for a while now but as a lone developer I haven\'t really used its features to its full extent. I\'ve now been tasked with working with a couple of colleagu
In my experience shelvesets are typically used for 3 purposes:
When you create a shelveset you have a checkbox to choose whether you want to undo your pending changes at the same time or not.
For #1, I would want to check the box to undo my changes, as the entire purpose of shelving is to get a clean local workspace to start on the new task.
For #2, I would probably not undo my changes, as after the colleague has looked at my code and helped me I will want to continue working on those changes.
For #3 this is only applicable if the code review workflow is pre-checkin, in that case you would typically undo your pending changes so you can start working on the next item while waiting for the review and not comingling the changes.
From a process perspective (in an agile shop) the primary use is to ensure your code builds with the existing code without breaking the build on your integration branch for the rest of your team. The items noted above will help you accomplish this task.
In short: never check anything in if it does not build correctly. Shelf your code to ensure it works and does not break the build before checking it in. If you do break the build for your team, your nightly builds (if you have them) won't work, so your testers will not have the new code base to work with.
Note: your code might be buggy at first but that's ok, just don't break the build. If your code is not mature enough to be tested (breaks something or perhaps the entire app), ensure your code is inactive in the application. There are lots of tricks for doing this from simply commenting the code out so you can check it in to adding an exception of some kind to prevent the code from running unless you set a variable during your debug. I am sure there are million other things you can do as well.
Just for reference, this MSDN link provides the usage of shelvesets as: