如何回滚TFS的提交?

93
我想回滚最近在 TFS 中所做的更改。在 Subversion 中,这非常简单。但是,在 TFS 中似乎非常头疼: 选项1:获取先前版本
  1. 手动获取每个文件的先前版本
  2. 签出以进行编辑
  3. 失败 - 在 VS2008 中签出会强制获取最新版本
选项2:获取 TFS Power Tools
  1. 下载 Team Foundation Power Tools
  2. 从命令行发出回滚命令
  3. 失败 - 如果有任何其他待处理更改,则无法工作
选项3:手动撤销更改
  1. 手动撤销我的更改,然后提交一个新的更改集
问题:如何在 TFS 中回滚到先前的更改集?

3
VSS没有回滚功能。他们确实有另一个名为“回滚”的功能,但在TFS术语中,它实际上是一个销毁操作。(a)只能从最新版本开始执行,如果在你想要回滚的版本之后有任何其他更改被检入,它将无法工作。(b)它会永久地从数据库中删除这些更改。 - Richard Berg
2
哦,我多么渴望 VSS 回滚的便利。 - Greg
3
最近我遇到了一个问题 - 为什么在TFS中回滚如此困难。回滚是源代码控制的基本功能之一。 - JohnIdol
3
这在TFS中太痛苦了! - Jon Kragh
2
转换到Mercurial!我换了工作,现在用TFS。自从那时起,我一直在编写PowerShell脚本,以便通过命令行实现类似Hg的操作。 - Sumo
17个回答

64
  1. 下载并安装 Team Foundation Power Tools
  2. 打开 Visual Studio 命令提示符。
  3. 导航到 TFS 映射的文件系统上的目录。如果不这样做,当您尝试回滚时将出现“无法确定工作区”的错误。
  4. 确保其他所有内容都已签入或搁置。
  5. 运行 tfpt rollback 以打开界面。
  6. 选择要回滚的更改集。
  7. 签入您回滚的文件的新版本。

该工具的主要缺点是在合并之前它会希望刷新您工作区中的所有内容。我通过创建一个专门用于回滚的新工作区,并直接映射到受影响文件所在的源树位置来解决了这个问题。

如果需要帮助确定要回滚哪些更改集,我发现免费的 Team Foundation Side Kicks 插件中的代码审查工具非常有用。


2
这个技巧对我很有用。工作区建议非常好(如果你正在处理大型代码库,这是非常重要的)。 - cloggins
2
警告...如果您使用不匹配的TFS和Visual Studio版本,那么会出现一个进退两难的情况。我正在使用VS2010与TFS2008(这是IT没有跟上开发的典型案例),并且TF.EXE与VS2010现在具有回滚功能...但它无法针对TFS2008工作。而tfpt 2010已经删除了回滚功能,所以我不能用旧方法来做。 - Simon Gillbee
8
“rollback” 命令已从 VS2010 Power Tools 中移除,现在您只需键入“tf rollback”即可:http://social.msdn.microsoft.com/Forums/en/tfspowertools/thread/1ce0844b-d607-433a-b239-bf5658b092f1 - Dan
1
如果您的TFS服务器支持“回滚”,则此选项才有效。不幸的是,我们使用的是TFS 2008,目前无法升级。似乎没有可行的方法可以在TFS Server 2008中回滚变更集。--James - James Mills
1
尝试让它为我工作,但它试图检出整个TFS项目,其中包含各种功能和发布的分支中超过20GB的文件,而我只想在特定的功能分支上工作。对于我的使用情况来说是不可接受的。 - Malachi
显示剩余3条评论

26

你的解决方案#1可以奏效: 1. 手动获取每个文件的先前版本

  1. 进行编辑

  2. 签入文件并在提示时忽略服务器更改。

它对你失败的原因是因为你必须开启“检出时获取项目的最新版本”选项。 通过转到工具...选项...源代码控制...Visual Studio团队基础架构服务器并取消选中“检出时获取项目的最新版本”来关闭此选项。

干杯


3
在使用 Power Tools 并且没有任何进展的情况下,我挣扎了两个小时,最终以这种方式完成了它... TFS 不支持这种基本功能是怎么回事啊... - alchemical
1
该功能已添加到TFS 2010 / Visual Studio 2010中。 - Robaticus
3
要明确的是,这不是真正的回滚。它只是获取旧版本。并非同一件事。 - Ryan Cromwell
1
指出“在检出时获取项目的最新版本”设置问题,加1分! - Sir Crispalot

19

回滚功能已经从tfpt.exe移动到了tf.exe,即Team Foundation版本控制工具。

TF - Team Foundation Version Control Tool, Version 10.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Rolls back the changes in a single or a range of changesets:
tf rollback /changeset:changesetfrom~changesetto [itemspec] [/recursive]
            [/lock:none|checkin|checkout] [/version:versionspec]
            [/keepmergehistory] [/noprompt] [/login:username,[password]]

tf rollback /toversion:versionspec itemspec [/recursive]
            [/lock:none|checkin|checkout] [/version:versionspec]
            [/keepmergehistory] [/noprompt] [/login:username,[password]]

1
有没有直接在 Visual Studio 中完成这个的方法? - Kyle Delaney

15

让选项1起作用的另一种方法是颠倒步骤顺序:

  1. 检出项目
  2. 获取到旧版本的特定版本
  3. 检入(忽略“警告服务器版本较新”对话框)或在待决更改对话框的冲突部分中通过保留本地版本解决冲突。

即使您已设置在检出时获取最新版本,此方法也适用。


2
对我没用。但那一定是因为某个脑残设置了愚蠢的TFS策略。 - SHODAN

15

6

作为参考,如果您正在使用TFS 2010,这里是Rollback Command (Team Foundation Version Control)手册的链接。

要回滚特定的变更集,请转到Visual Studio Command Prompt (2010),导航到您的TFS工作区目录,并输入以下命令:

tf rollback /changeset:C12345

这里的12345代表你的变更集编号。之后,它会显示所做的日志,您需要解决合并冲突。


5

没有回滚选项实际上是TFS的一个功能特性 ;)

要回滚更改:

  1. 检出您想要的任何特定版本的更改
  2. 编辑->全选->复制文件中的文本
  3. 检出服务器上的文件版本
  4. 粘贴到文件中并检入。

现在,回滚之前的所有中间更改集也都保存了!多么棒的功能!


1
起初我以为这是讽刺的,但对于我们这些没有被授予回滚权限的人来说,这个解决方案实际上可能是有效的。 - EBarr
1
除非稍后对你真正想保留的相同文件进行更改。 - Robert Jeppesen
1
粗糙但这是我在TFS中执行此操作的唯一方式。如果我检出然后检索旧版本,每当我尝试将其检入时,TFS都会自动合并到最新版本。 - Steve

5

啊,我刚刚发现了这篇CodePlex文章,介绍了如何使用TFPT.exe(一种强大的工具)回滚代码更改。

希望这篇文章能对你有所帮助。


2
另一个选项是TFSPlus。这个Visual Studio插件在历史窗口中添加了“获取此版本”命令。如果您已经签出文件,它将用该版本替换它。如果之后进行检入,您将有效地回滚到该版本。它适用于单个文件而不是完整的变更集。

2

获取特定版本

版本下拉菜单中选择 类型,将其设置为变更集

使用"查找变更集..."按钮来查找您的变更集,或者直接输入编号(如果您知道该编号)

获取特定的变更集之后

检出

检入


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接