The purpose of shelving is to enable unfinished changes, such as work in progress, to be sent to the server without needing to submit a changeset. Shelving a changeset, to create a shelveset, is useful in the following scenarios:
Backing-up changes to the server
When the changeset is shelved the changes are saved on the server. If the workspace changes are lost the user can create a new workspace and unshelve the shelveset.
Shelvesets include the concept of ownership. In this situation other users will not be able to unshelve the shelveset unless an administrator removes ownership.
Handing changes over to another user
A user may implement some of the changes and then hand it over to another user for completion. To do this the user will shelve the changeset, removing ownership. The second user is then able to unshelve the shelveset into their workspace, take ownership, and complete the changes.
Another user testing changes
A user may implement the changes but want another user to test them (or want to test them on a different platform) before submitting. To do this the user will shelve the changeset removing ownership. The tester is then able to unshelve the shelveset, without taking ownership, into their workspace. After the changes have been tested the original user can unshelve the changeset back into their own workspace and either submit it or make further changes.
Transferring a changeset to a different workspace or stream
In certain situations a series of changes may be started in one place but a decision is made to implement them in another. For instance, moving them to an earlier or later release stream. The user shelves the changeset in the original stream and unshelves it in the new stream.