将项目更新到版本与恢复到版本的区别

164

我已经开始使用 TortoiseSVN 中的 Subversion。如果我打开日志并右键单击旧版本,我会看到两个选项,听起来像是将其回滚到旧版本: "将项目更新到修订版" 和 "恢复到该修订版"。

我知道当您只想查看旧版本而不真正更改存储库时,更新到旧版本用于使用。还原是当您实际上出了问题并希望存储库中的最新版本与旧版本相同时。

所以说 HEAD 修订版是 100,我恢复到了 95。它会将我的工作副本反向合并到 95。然后我可以提交该更改到存储库,这将创建修订版 101,对吗?如果我回退到修订版 95,这种情况有什么不同吗?它不仍然只是撤消最后修订版的更改吗?我对回滚或更新到旧版本后工作副本状态的区别感到困惑。

6个回答

206

更新至某个版本仅更新你的工作副本中选择的版本的文件。 但是,你不能继续在这个版本上工作,因为SVN会报告你的工作副本已过期

还原到此版本将撤消所选版本之后在您的工作副本中进行的所有更改(在您的示例中为rev. 96、97、98、99、100)。 您的工作副本现在处于修改状态

两种情况下的文件内容相同,但第一种情况下你有一个未修改的工作副本,你无法提交你的更改(因为你的工作副本没有指向HEAD rev 100),而在第二种情况下,你有一个修改过的工作副本指向HEAD,你可以继续工作和提交。


1
好的,假设我更新到修订版本,但我的工作副本已经过时。没有任何阻止我更改文件的东西。如果我更改了其中一个文件并尝试提交它,那会怎样呢?我猜Subversion会看到冲突,并强制我将存储库中最新版本合并到我修改的工作副本中,然后再提交它。 - Eric Anastas
5
如果您试图提交一个比HEAD旧的BASE-Revision的项目,您将收到“提交失败:您的工作副本可能已过期”的提示。 - Peter Parker
update torevert to/from 如何处理本地修改(未提交的更改)? - BaltoStar
两种方法都保留了本地更改,但是在两种情况下,本地更改可能会导致冲突,在还原的情况下,回滚的修改与所有其他用户的本地更改混合在一起。因此,请至少保存您的修改的补丁或提交到分支。 - Peter Parker
1
我一直认为这两个选项命名不清晰,容易让人困惑。由于经常忘记,我不得不反复查看它们的含义。他们应该将其命名为“回滚”或其他类似的名称。 - Epirocks

32
为了理解两种情况下您的工作副本状态不同,您必须了解“基础版本”的概念:BASE revision
引用块中写道:
基础版本
工作副本中项目的修订号。如果该项目已被本地修改,则此指的是该项目在没有这些本地修改的情况下的样子。
您的工作副本包含每个文件的快照(隐藏在 .svn 文件夹中),这意味着这是 BASE 版本,也就是自上次从仓库检出时的状态。这就解释了为什么工作副本需要2倍空间,并且如何在没有网络连接的情况下检查甚至还原本地修改。
将项目更新到某个特定修订版本会更改基础版本(BASE),使其过期。当您尝试提交本地修改时,SVN会注意到您的基础版本与仓库HEAD不匹配。在修复此问题之前,提交将被拒绝,需要进行更新(可能还需要合并)。
回滚到某个特定修订版本时,不会更改基础版本(BASE)。从概念上讲,它与手动编辑文件以匹配较早的修订版本几乎相同。

从被接受的答案中可以看出,“两种情况下的文件内容是相同的”。那么为什么还要费心呢?这个答案解释了最终的区别,并解释了在尝试提交时,“更新”与“还原”会导致不同的行为。 - radarbob
update torevert to/from 如何处理本地更改(未提交的更改)? - BaltoStar

6

将您的工作副本更新到所选版本。如果您想让您的工作副本反映过去的某个时间,或者如果仓库已经有了进一步的提交,并且您想逐步更新您的工作副本,则此功能非常有用。最好更新您的整个工作副本目录,而不仅仅是一个文件,否则您的工作副本可能会不一致。如果您的测试已经完成,您可以使用此命令来测试另一个版本或使用 SVN Update 获取HEAD

如果您想永久撤消早期更改,请改用恢复到此版本

-- 来自TSVN帮助文档

如果您将工作副本更新到较早版本,这只会影响您自己的工作副本。在您做出更改并想要提交之后,您将失败,TSVN会提示您先将WC更新到最新版本。 如果您还原到某个版本,则可以提交到存储库。每个人都将返回到更新后的版本。


6
您的工作副本中的文件可能在之后看起来完全相同,但它们仍然是非常不同的操作——仓库处于完全不同的状态,并且您将有不同的选项可供选择,以便恢复到旧版本。简而言之,“更新到”只影响您的工作副本,而“反向合并和提交”将影响仓库。
如果您“更新”到旧版本,则仓库未更改:在您的示例中,HEAD版本仍为100。您无需提交任何内容,因为您只是在处理您的工作副本。如果您修改了您的工作副本并尝试提交,您将被告知您的工作副本已过期,并且您需要在提交之前进行更新。如果在同一仓库上工作的其他人执行“更新”,或者您检出第二个工作副本,则它将是r100。
但是,如果您“反向合并”到旧版本,则您的工作副本仍基于HEAD(假设您已经更新)——但是您正在创建一个新版本以取代不需要的更改。您必须提交这些更改,因为您正在更改仓库。完成后,基于HEAD的任何更新或新工作副本都将显示r101,并具有您刚刚提交的内容。

1

来自Tortoise参考的文本:

更新项目到修订版 将您的工作副本更新到所选修订版。如果您想让您的工作副本反映过去的某个时间,或者如果仓库中有进一步的提交并且您想逐步更新您的工作副本,则此功能非常有用。最好更新您工作副本中的整个目录,而不仅仅是一个文件,否则您的工作副本可能会不一致。

如果您想永久撤消早期更改,请改用“还原到此修订版”。

还原到此修订版 还原到早期的修订版。如果您进行了多次更改,然后决定真正想回到N修订版的状态,那么这就是您需要的命令。更改将在您的工作副本中撤消,因此此操作不会影响仓库,直到您提交更改为止。请注意,这将撤消所选修订版之后进行的所有更改,并将文件/文件夹替换为早期版本。

如果您的工作副本处于未修改状态,在执行此操作后,您的工作副本将显示为已修改。如果您已经进行了本地更改,则此命令将将撤消更改合并到您的工作副本中。

内部发生的情况是Subversion对所选修订版本之后进行了反向合并,撤销了先前提交的更改效果。

如果执行此操作后您决定要撤消撤消并将工作副本恢复到其以前未修改的状态,则应使用Windows资源管理器中的TortoiseSVN →还原,这将放弃此反向合并操作所做的本地修改。

如果您只想查看文件或文件夹在早期修订版本中的样子,请改用“更新到修订版本”或“另存为修订版本”。


0

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