如何在Visual Studio TFS中进行回滚?

53

我正在处理一个大型项目的子模块,并使用VSTS 2008。

我需要将该模块回滚到早期版本(大约是前4次提交)。我尝试在Visual Studio UI中执行此操作,最终意识到没有回滚选项。

经过一些研究,我确定有一个Power Tools下载,声称通过命令行工具支持回滚。但是,几乎没有文档可用。

请问有人可以逐步描述如何在VS2008中回滚到以前的版本吗?(使用Power Tools或其他方式)。

额外问题-是否有人知道我们是否会在VS2010中获得更强大的回滚支持?


1
当在Google上询问TFS中的回滚时,此问题会弹出,我只想补充一下,在TFS 2012中,这变得更加容易。有关更多信息,请参见我的答案。 - René
7个回答

41

在源代码控制器中,右键点击文件夹,选择“获取指定版本”,选择您所需的版本(按变更集、日期、标签等选择)。

注意:此时本地版本将是您所需的版本。检出已更改的文件,再将它们检入。这将启动合并向导,并且它可能会抱怨服务器有比你更新的版本。按照您想要的方式合并文件(其中一个选项是放弃服务器更改,这似乎是您想要的)。完成此过程后,它可能会告诉您由于合并过程没有检入任何文件(或类似的内容),只需单击“确定”然后再次检入即可。这应该实现您的需求。


91
如果这真的是答案,对TFS来说相当令人难过。 - alchemical
2
这真是一件痛苦的事情,应该有更好的解决方式。 - Brett Widmeier
2
此方法在想要回滚一个文件夹并且其中有新文件添加或其他文件被删除时根本不起作用。 - bitbonk
8
太糟糕了。必须逐个导航到每个文件并在获取旧版本后将其签出和签入,才能还原更改。我们很高兴已经转移到SVN上。 - Chev
6
现在有一种更好、更快的方法。请看@Rene的回答。使用更新的TFS和VS,您需要通过源代码控制资源管理器进行操作,只需两个步骤即可立即为变更集中的所有文件完成操作。太好了! - Piotr Kula
显示剩余5条评论

36

TFS 2012使得这个事情变得容易多了。现在有一个GUI中的回滚选项。

MSDN上有更多关于如何操作以及可用选项的信息。 以下是来自MSDN的文本,说明如何回滚到特定版本:

要回滚到特定版本:

  1. 在源代码控制资源管理器中,选择一个项,右键单击打开其快捷菜单,然后选择“回滚”。
  2. 在回滚对话框中,选择“回滚到特定版本”。

当然,您也可以回滚整个changeset或一组changesets。如果需要,还可以轻松地回滚到特定时间点。


2
是的,这比我之前在解决方案资源管理器中使用回滚要好得多,因为每次它只会还原到最近的 TFS 文件。您的建议非常好而且简单易行!我认为这是最新和最好的答案。 - Piotr Kula
1
回滚和获取特定版本有什么不同? - Kyle Delaney
1
@KyleDelaney 的 "获取特定版本" 只是将该版本获取到您的磁盘上,而不会有任何待处理更改,但 "回滚" 会自动将所有更改的文件标记为 "编辑、回滚",您可以直接检入回滚版本... - Christoph Fink

12

有一种方法,但我认为它不太好看。打开Visual Studio命令提示符并..

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>tf rollback -?
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]]

Versionspec:
    Date/Time         D"any .Net Framework-supported format"
                      or any of the date formats of the local machine
    Changeset number  Cnnnnnn
    Label             Llabelname
    Latest version    T
    Workspace         Wworkspacename;workspaceowner

这似乎不在VS2008中可用(由OP标记) - Morgan T.

11

2
这个可以工作,但我感觉它不是真正的回滚。期望的功能应该是删除自回滚到现在所做的所有变更集。这只是添加了一个新的变更集,其中包含回滚的内容。 - matadur
@matadur,该方法的问题是可能会删除您不需要的更改,例如其他分支,其他解决方案,构建过程模板以及从TFS 2012开始的代码审查请求/响应和反馈客户端请求/响应。您还可能遇到工作项中孤立的链接,构建中的孤立引用以及本地工作区与服务器不可恢复地不同步。(即,当开发人员检入某些待处理更改时会发生什么?)如果您想“回滚”所有内容,请恢复 SQL 级别的备份。 - Warren Rumak
对我们来说非常完美,因为我们已经开发了功能,然后在另外10个变更集之后决定删除该功能。这使您只能回滚特定的变更集。太棒了! - Neville
@WarrenRumak 难道这不是TFS应该跟踪的吗(我想可以使用外键或类似的方式完成)。至于待处理更改,也许可以使用锁定字段。 - samus

6

额外的问题--有人知道我们是否可能在VS2010中获得更强大的回滚支持吗?

是的。与Power Tools不同,它直接针对现有的2008客户端API进行编码,TFS 2010具有用于直接在服务器上执行回滚的新API。这使它们更快,更可靠,并添加了在2008中根本不可能的功能,例如还原合并历史记录。


6

来自 MSDN 文章 如何回滚变更集 (VS2008,但其他版本也可用)

要还原文件到早期版本,请按以下步骤操作:
  1. 在源代码控制资源管理器中,右键单击要回滚的文件,然后单击“获取特定版本”。获取对话框将出现。
  2. 在类型下,单击“变更集”。
  3. 在变更集下,单击省略号(…)。
  4. 在“查找变更集”对话框中,使用默认值或指定搜索标准,然后单击“查找”。
  5. 在结果下,单击包含您想要还原文件的版本的变更集,然后单击“确定”。
  6. 在获取对话框中,选择覆盖未签出但可写入的文件复选框,然后单击“获取”。早期版本的文件将被复制到本地工作文件夹。
  7. 在源代码控制资源管理器中,右键单击该文件,然后单击“编辑以检出”。
  8. 在“检出”对话框中,单击“检出”。
  9. 在源代码控制资源管理器中,再次右键单击该文件,然后单击“检入待处理更改”。
  10. 在“检入 - 源文件”对话框中,单击该文件,然后单击“检入”。解决冲突对话框将出现,并显示一条消息,说明没有检入文件,因为两个版本存在冲突。
  11. 在消息框中,单击“确定”。将出现“待处理更改 - 冲突”窗口。
  12. (可选)在“待处理更改”窗口的工具栏中,单击“比较本地和服务器”。服务器和本地副本并排显示,以便您在回滚更改之前审查您的决定。
  13. 在“待处理更改”窗口中,单击“保留本地版本”。
  14. 在源代码控制资源管理器中,右键单击该文件,然后单击“检入待处理更改”。
  15. 在“检入 - 源文件”对话框中,单击“检入”。

4
在 Visual Studio 2013 中,这变成了一个更容易的任务。要回滚,请执行以下操作:
  1. 源代码控制资源管理器中,选择解决方案/项目
  2. 右键单击,然后选择"查看历史记录"
  3. 在历史记录视图中,选择要回滚的更改集
  4. 右键单击,然后选择查看更改集详细信息。 这将打开团队资源管理器。
  5. 在团队资源管理器中,单击"回滚"
    Team Explorer
  6. 要使回滚永久生效,您现在需要签入。或者您可以对回滚版本进行更改,然后签入。

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