Not so long ago I heard that it was impossible to unshelve a shelveset from the branch it was shelve on to a different branch. It is the way Team Foundation Server (TFS) works I was told. And indeed it is the way tfs works out of the box. I asked a colleague and he researched it and gave me the same message: you cannot do it. He is right but I was not satisfied. I needed to find a solution. I either would write it myself or I would find an existing tool. And I found it. It can be done and the way to do it is with the unshelve command of the powertools for tfs.
The commandline of the unshelve command of this tool is:
tfpt unshelve - Unshelve into workspace with pending changes
Allows a shelveset to be unshelved into a workspace with pending changes.
Merges content between local and shelved changes. Allows migration of shelved
changes from one branch into another by rewriting server paths.
Allows changes from an already-unshelved shelveset to be undone, cleaning
up pending adds, and preserving other existing pending changes in the
Usage: tfpt unshelve [shelvesetname[;username]] [/nobackup]
[/migrate /source:serverpath /target:serverpath]
shelvesetname The name of the shelveset to unshelve
/nobackup Skip the creation of a backup shelveset
/migrate Rewrite the server paths of the shelved items
(for example to unshelve into another branch)
/source:serverpath Source location for path rewrite (supply with /migrate)
/target:serverpath Target location for path rewrite (supply with /migrate)
/undo Undo pending changes from an unshelved shelveset
/batchsize:num Set the batch size for server calls (default 500)