Migrating a TFVC shelveset to Git with Git-Tfs

You’ve migrated your code base (or as much of it as you can) from TFVC and now a user just realised they need some super important code from a shelveset. How does one go about migrating this? As far as I see it, you have three options.

  1. Manually copy the changes over.
  2. Unshelve the changes, commit to the branch and pull in to the Git repository.
  3. Use the git-tfs unshelve command.

In my case the shelve was too big for option 1 and too old / contained breaking changes for 2, leaving option 3.

One thing to note that when migrating a shelve from TFS, it will create a new branch against master. In my case, I wanted a new branch against a development branch.

What I want:

master
      _development
                   _shelveset branch

What git-tfs does:

master
    _development
 _shelveset branch

But hey, this is Git, so it’s no problem!!

# Get the shelveset from TFS and stick it in to a new branch
git tfs unshelve -u="Shelveset Owner Name" "Shelveset Name" TargetBranchName_TEMP

# Checkout that new branch
git checkout TargetBranchName_TEMP

# Get the hash for the head of the new branch
git log --pretty=format:%h -n 1

# Now switch to your dev branch
git checkout development

# Create a new branch for the shelveset
git branch TargetBranchName
git checkout TargetBranchName

# Merge the temp shelveset branch in to it's final location
git cherry-pick HASH

# You might have some things to merge now.
git commit -m "Migrated shelveset 'Shelveset Name'"