Skip to main content

Rollback a Ooops in TFS with TFPT Rollback

Rhut roe, Raggie. You just checked in a merge operation affecting 100's of files in TFS against the wrong branch. Ooops. Well, you can simply roll it back, right? Select the folder in Source Control Explorer and...hey, where's the Rollback?
Rollback isn't supported in TFS natively. However, it is supported within the Power Tools leveraging the command-line TFPT.exe utility. It's fairly straightforward to revert back to a previous version--with one caveot.
First, download and install the Team Foundation Power Tools 2008 on your workstation. Before proceeding, let's create a workspace dedicated to the rollback. To "true up" the workspace, the rollback operation will peform a Get Latest for every file in your current workspace. This can consume hours (and many GB) with a broad workspace mapping. To work around this, I create a temporary workspace targeted at just the area of source I need to roll back. So let's drill down on our scenario...
I'm working on Program.cs and I accidentally check in a change I shouldn't have. Oops.



Let's create a workspace mapped just to the folder housing Program.cs so we avoid a massive, entire workspace "Get" during the rollback operation.

Afterwards, select that workspace and perform a Get Latest (just to establish the file system directory). Open up a Visual Studio 2008 command prompt and browse to the workspace on the file system.
To perform a rollback, you can target a changeset or a filespec. I prefer the specificity of the changeset but whatever works for you. You also have flexibility with merge and recursive behavior. Here's the full write-up on MSDN for Rollback. Alternatively, just type in a

TFPT rollback /?



Executing the TFPT rollback command (with the /changeset option in this example), will earn you a prompt to get the latest. Go ahead and click Yes.



Important to note here with the changeset option: you want to identify the changeset one prior to the version you wish to rollback to. So, if I want to rollback to changetset 227, I want to use changeset 228 in the TFPT operation.

Next, you'll be presented with all the assets (files) in that folder involved in that particular changeset (228 in this case). We only want to roll back Program.cs so we'll only select that file. If you Ctrl-A and uncheck one box, it will uncheck them all. Click Rollback.

Next, you'll receive feedback at the command line about the operation. But wait, you're not finished! Rollback is a local operation. You still need to check in your change. This is a great "safety" if you messed up the rollback itself. Just Undo Pending Changes.
Ok, so we're ready to check in our changes.

Looking at View History once more, note we actually have a third version and changeset now: 229. But, we've indeed returned to the original (the first, changeset 227) version of the source.



Being back to square one never felt so good...

Comments

Rob Streno said…
Hmmm. Wouldn't it be great if someone created a nice PowerShell script to do this?
Ricardo Wilkins said…
Re: your comment about choosing "the one prior to the version you want to rollback to..." - would you agree that rollback is not just important for moving the codebase back to a previous state, but is also important when an 'undo' of a feature or change to the code is necessary? Thus, that could mean a rollback of a small changeset that was checked in 3 weeks ago, for example. Of course, testing now becomes more important. Would you agree, or is this bad practice?
Jeff Hunsaker said…
@Ricardo Maybe I'm old school but if I were removing functionality, I would want to create a new work item and merge that removal into the history. Probably more CYA than anything but it's a data point which would be shoved under the rug if we did a rollback. I'd want to be able to log/audit this feature removal b/c "Well, Ms. Sponsor, we're 2 weeks late b/c we were asked to add and remove this feature 4 times. See here on this report...? It shows Mr. Product Owner approving this work item and re-opening it 4 times." Also, what about functionality added in those past three weeks?
Ricardo Wilkins said…
the first CYA moment happens automatically - the rollback itself is a check-in/changeset; it's now part of version history. CYA #2: add a comment to the rollback check-in. CYA #3: associate the check-in with the work item you created the moment they asked you to remove the feature. Regarding functionality added since that rollback moment... that's the part where you have to cross your fingers. :) But my experience w/ this feature-rollback scenario so far has been [suprisingly] successful.
Jeff Hunsaker said…
@Ricardo Ok, uncle! Good points. I'd still be careful about wacking modifications made between the original and the rollback. Developers are sneaky. :)
Anonymous said…
Interesting. Of course TFPT just wraps TF and TF is just a command line for doing what you can do in the VS GUI. And, underneath the covers, they're doing the same thing we do now:

Check out; get a specific version of the branch that you want to roll back, undoing local changes when prompted. This checks it all in to the version to which you rolled back.

I thought the instructions he had were longer and more confusing than just doing it the original way.
Michael said…
what if I have the following changesets:
6
5
was not my project (4)
3
2
1

and I realize that I need to roll back to 2.

Do I issue tfpt rollback /changeset:3 or do issue individual commands (one for each of my changeset numbers (6, 5, 3)?
Jeff Hunsaker said…
@Michael You simply want to issue the rollback ... :3. It doesn't matter who committed the previous versions. Note however, the changes committed by others in v4 will be removed as well.
der Nico said…
I assume the merge candidates already processed before the rollback will be lost after the rollback. Or will I see them again?
Jeff Hunsaker said…
@Nadine I would assume so but before attempting the rollback, I would clear out your workspace of any merges, edits, check-outs, etc.

Popular posts from this blog

TFS Error | The type initializer for 'Microsoft.TeamFoundation.Build.Server.BuildInformationNodeBinder' threw an exception.

Posting this one for the search engines. If you ever receive the exception "The type initializer for 'Microsoft.TeamFoundation.Build.Server.BuildInformationNodeBinder' threw an exception.", more than likely, your drive space is at 0 on your TFS application tier box.

I encountered this at a client recently. The root cause was that IIS logs had filled up the OS drive (C:\). I switched IIS logging to the applications drive (D:\) which cleaned up the OS drive and resolved the issue.

Detailed message:


TF53010: The following error has occurred in a Team Foundation component or extension:


Date (UTC): 6/7/2011 4:18:53 PM

Machine: TFSATBOX

Application Domain: /LM/W3SVC/8080/ROOT/tfs-1-129519118182628600

Assembly: Microsoft.TeamFoundation.Framework.Server, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a; v2.0.50727

Service Host: 7ecfbd77-b386-4d75-b038-b05474782696 (DefaultCollection)

Process Details:

Process Name: w3wp

Process Id: 3676

Thread Id: 5752

Ac…

Shrinking WSS (Sharepoint) SQL Server Log Files

Yesterday, while migrating a source repository from StarTeam to TFS, I received the following error:
"TF30042: The database is full. Contact your Team Foundation Server administrator."Excuse you? Sure enough, my 100+ GB drive was full on the server. But I'd only migrated around 1000 items. Surely SQL wasn't consuming 100MB per file.

Turns out (yes, there was a lot of crud on the drive but...) the majority of the space, almost 40GB was being consumed by the Windows Sharepoint Services WSS Content data and log SQL Server files. Huh? I still need to investigate and understand why this portal, which is 100% unused, grew so large. Regardless, here's what I did to resolve:

Since this is not yet a production database, I flipped the SQL recovery option from Full to Simple for WSS Content and several other databases. Detail here and here.
Executed the maintenance plan for all the databases to get backups and clear out some of these files. That didn't help much. The Auto_…

Verified by Visa: Everything We Tell Folks to Avoid

Phishing is defined by F-Secure as: "Fraudulent e-mail or website claiming to be legitimate seeking indentifiable information. Phishing is an attempt to steal your personal data."When I recently attempted an online purchase from WalMart using my VISA card, being a security wanta-be, I immediately thought phishing when redirected to verifiedbyvisa.com and saw this dialog:

Seriously, these folks have to be kidding. You're asking for my personal data during a transaction and claim that's its a service "...at no additional cost." Wow! Thanks...but absolutely not, you jokers. As a malicious thief, I can go a long way with this data.

This is exactly the type of experience which aids malfeasance and the folks trying to steal personal data / identities. How long have we been working to educate folks to avoid providing this type of data under these type of circumstances? Years. And we're just now starting to turn the corner.

VISA, get rid of this! When folks submi…