Rollback 命令(Team Foundation 版本控制)

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

可以使用 Team Foundation 版本控制 (TFVC) tf rollback 命令将一个或多个变更集的效果回滚到一个或多个版本控制项。 此命令不会从项的版本历史记录中移除变更集。 相反,此命令会在工作区中创建一组挂起的更改,以否定指定的变更集的效果。

先决条件

若要使用此命令,必须将“读取”、“签出”和“签入”权限设置为“允许”。 有关详细信息,请参阅默认 TFVC 权限

语法

tf rollback /toversion:VersionSpec ItemSpec [/recursive] [/lock:none|checkin|checkout] [/version:versionspec] [/keepmergehistory] [/login:username,[password]] [/noprompt]
tf rollback /changeset:ChangesetFrom~ChangesetTo [ItemSpec] [/recursive] [/lock:none|checkin|checkout] [/version:VersionSpec]
[/keepmergehistory] [/noprompt] [/login:username,[password]]

参数

参数

Argument

说明

<ChangesetFrom>~<ChangesetTo>

将此参数与 /changeset 选项一起使用,以指定要回滚的变更集。 可以通过下列方式指定变更集:

  • 单个变更集,例如 /changeset:C11
  • 变更集范围,例如 /changeset:C7~C20
  • 日期,例如 /changeset:D09/30/09
  • 日期范围,例如 /changeset:D09/23/09~D10/07/09
  • 最新的变更集,/changeset:Tip/changeset:T

<ItemSpec>

使用此参数可指定要回滚的一个或多个项。 如果使用 /toversion 选项,则必须指定此参数。

有关 TFVC 如何分析项规范的详细信息,请参阅使用 Team Foundation 版本控制命令

注意

可指定多个 itemspec 参数。

<VersionSpec>

/version 选项和 /toversion 选项的用户提供的值。

将此参数与 /toversion 选项一起使用,以将文件还原到特定变更集中的状态。 可通过以下方式指定版本:

  • 单个变更集,例如 /toversion:C32
  • 午夜的日期,例如 /toversion:D06/19/09
  • 日期和时间,例如 /toversion:D06/19/09T14:32
  • 标签,例如 /toversion:LTestLabel
  • 映射到当前目录的工作区中的版本,/toversion:W
  • 特定工作区中的版本,例如 /toversion:WResolveRIConflicts;AKerry

有关 TFVC 如何分析 versionspec 的详细信息,请参阅使用 Team Foundation 版本控制命令

选项

选项

说明

/changeset

使用此选项可指定要否定的一个或多个特定变更集。

/keepmergehistory

仅当要回滚的一个或多个变更集包含分支或合并更改时,此选项才有效。 如果希望将来在同一源和同一目标之间进行合并以排除要回滚的更改,请指定此选项。

/lock

指定此选项可在你完成回滚所有相关更改之前阻止其他用户签入或签出项。 有关详细信息,请参阅了解锁定类型

锁定选项:

  • None。 默认。 未应用锁定。 如果要回滚的文件已被锁定,则此选项将移除锁定。
  • Checkin。 锁定项,直到通过执行签入解除锁定。 其他用户可以签出指定的项,但在移除锁定之前,用户无法签入修订。 无法锁定已锁定的文件。
  • Checkout。 防止用户签入或签出锁定的项,直到你通过执行签入来移除锁定。

/login

有关此选项的信息,请参阅使用选项修改命令的运行方式

/noprompt

使用此选项可禁止在此操作期间显示的任何对话框。

/recursive

如果希望操作在子文件夹中包含项,请指定此选项。

/toversion

指定此选项可将文件还原到特定变更集中的状态。 使用此选项时,将否定自指定版本以来应用的所有变更集的效果。

/version

指定要回滚的文件和文件夹的当前版本。

注解

tf rollback 命令将否定你为指定的每个项指定的每个变更集的效果。 下表列出了该操作如何否定每种更改。

回滚的更改类型 回滚更改的类型
添加、分支或撤消删除 delete
edit edit
encoding encoding
重命名/移动 重命名/移动
delete undelete
merge 对合并到当前分支的任何更改进行否定的更改。

以下列表提供了 rollback 命令导致的更改的一些示例:

  • 回滚发生了“添加”更改的变更集。 回滚操作会导致“回滚”更改和“删除”更改。

  • 回滚发生了“编辑”更改的变更集 521。 回滚操作会导致“回滚”更改和“编辑”更改,从而否定变更集 521 中的“编辑”更改。

  • 在变更集 132 中,已从 $/BranchA/File1.txt 合并到 $/BranchB/File1.txt。 该合并中的更改包括更改集 92 和 104 中的“编辑”更改。 在变更集 162 中,回滚变更集 132,这会导致“回滚”更改和对 $/BranchB/File1.txt 的“编辑”更改,从而否定变更集 92 和 104 中的“编辑”更改。

退出代码

运行 tf rollback 命令后,将显示下表中的退出代码。

退出代码 说明
0 操作已成功回滚所有项。
1 操作已成功回滚至少一个项,但无法回滚一个或多个项。
100 操作无法回滚任何项。

示例

下面的示例否定变更集 23 对该更改集中已更改的所有项的影响:

c:\workspace> tf rollback /changeset:C23

下面的示例否定变更集 23 对文件 a.txt 的影响:

c:\workspace> tf rollback /changeset:C23 a.txt

下面的示例更改 a.txt 的内容,以匹配使用变更集 23 签入的版本:

c:\workspace> tf rollback /toversion:C23 a.txt

下面的示例更改 OurTeamProject 的内容,以匹配在 2009 年 8 月 31 日午夜或之前应用的最后一个变更集:

c:\workspace> tf rollback /toversion:D08/31/2009 /recursive $/OurTeamProject/

示例 /keepmergehistory 选项

回滚包含分支或合并更改的变更集时,通常需要将来在同一源和同一目标之间进行合并,以包含这些更改。 但是,如果希望将来在同一源和同一目标之间进行合并以排除过去合并操作中包含的变更集,则可以使用 /keepmergehistory 选项。 例如:

  1. 2009 年 6 月 30 日,将所有项从 $/BranchA/ 完全合并到 $/BranchB/。

    c:\workspace> tf merge $/BranchA $/BranchB
    

    将此合并作为变更集 292 的一部分签入。

  2. 7 月,对 $/BranchA/Util.cs 进行了多项更改。 这些更改包含在变更集 297、301 和 305 中。

  3. 2009 年 8 月 1 日,将 $/BranchA/Util.cs 合并到 $/BranchB/Util.cs。

    c:\workspace> tf merge $/BranchA/Util.cs $/BranchB/Util.cs
    

    将更改作为变更集 314 的一部分签入。 此操作的结果是,在更改集 297、301 和 305 中对 $/BranchA/Util.cs 所做的编辑现在也应用于 $/BranchB/Util.cs。

  4. 一周后,你意识到在 7 月对 $/BranchA/Util.cs 所做的编辑不适用于 $/BranchB/Util.cs。 可以使用 rollback 命令来否定这些更改。 使用 rollback 命令回滚“合并”更改或“分支”更改时,需要做出决定。

    • 如果希望在将来的合并中将 7 月对 $/BranchA/Util.cs 所做的更改重新应用于 $/BranchB/Util.cs,请输入以下命令:

      c:\workspace> tf rollback /changeset:314
      
    • 如果希望 7 月对 $/BranchA/Util.cs 所做的更改永远不会在将来的合并中重新应用到 $/BranchB/Util.cs,请输入以下命令:

      c:\workspace> tf rollback /changeset:314 /keepmergehistory
      
  5. 几周后,将 $/BranchA/ 合并到 $/BranchB/。

    c:\workspace> tf merge $/BranchA $/BranchB
    
    • 如果在回滚时省略了 /keepmergehistory 选项,“合并”更改将应用于自变更集 292 以来应用于 $/BranchA/Util.cs 的 $/BranchB/Util.cs 所有变更集,包括变更集 297、301 和 305。 换句话说,合并会撤消回滚更改。

    • 如果在回滚时包括了 /keepmergehistory 选项,合并操作将应用于自变更集 292 以来应用于 $/BranchA/Util.cs 的 $/BranchB/Util.cs 所有变更集,不包括变更集 297、301 和 305。 换句话说,合并不会撤消回滚更改。 因此,BranchA 上的内容可能与 BranchB 上的内容不匹配。