ChatGPT解决这个技术问题 Extra ChatGPT

将项目更新到修订版与恢复到修订版

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

我知道当您只想回顾旧版本但不想真正更改存储库时,会使用更新到旧版本。 Revert 是当您真正搞砸并希望存储库中的最新版本与旧版本相同时。

所以说 HEAD 修订版是 100,我恢复到 95。它会将我的工作副本反向合并回 95。然后我可以将该更改提交到将创建修订版 101 的存储库对吗?如果我要更新回修订版 95,那有什么不同?它不仍然只是扭转上次修订的变化吗?我对在还原或更新到旧版本后工作副本的状态有何不同感到困惑。


P
Peter Parker

更新到修订版只会将您的工作副本的文件更新到您选择的修订版。但是你不能继续在这个版本上工作,因为 SVN 会抱怨你的工作副本已经过时了。

恢复到此修订版将撤消在选定修订版之后所做的工作副本中的所有更改(在您的示例中 rev. 96,97,98,99,100) 您的工作副本现在处于修改状态。

两个方案的文件内容是相同的,但是在第一种情况下,您有一个未修改的工作副本并且您无法提交您的更改(因为您的工作副本不指向 HEAD rev 100)在第二种情况下,您有一个修改后的工作副本指向 head 和你可以继续工作并承诺


好的,所以说我更新到修订版并且我的工作副本没有数据。没有什么能阻止我更改文件。如果我更改其中一个文件并尝试提交它会怎样。我猜 subversion 会看到冲突并迫使我在提交之前将存储库中的最新版本合并到修改后的工作副本中。
如果您尝试使用比 HEAD 更旧的 BASE-Revision 提交项目,您将收到“提交失败:您的工作副本可能已过期”
update torevert to/from 如何处理本地更改(未提交的更改)?
这两种方法都保持本地更改不变,但是本地更改在这两种情况下都可能导致冲突,并且在还原情况下,回滚的修改与所有其他用户的本地更改混合在一起。所以至少保存你的修改补丁或提交到一个分支。
我一直认为这两个选项名称不好且不清楚。由于忘记,我不得不反复查找它们的含义。他们应该将其命名为“回滚”之类的
W
Wim Coenen

要了解您的工作副本的状态在这两种情况下有何不同,您必须了解 BASE revision 的概念:

BASE 工作副本中项目的修订号。如果项目已在本地修改,这是指项目在没有这些本地修改的情况下显示的方式。

您的工作副本包含此 BASE 修订版中每个文件(隐藏在 .svn 文件夹中)的快照,这意味着与上次从存储库中检索时一样。这解释了为什么工作副本占用 2 倍的空间,以及如何在没有网络连接的情况下检查甚至恢复本地修改。

Update item to Revision 会更改此基础修订版,使 BASE 过时。当您尝试提交本地修改时,SVN 会注意到您的 BASE 与存储库 HEAD 不匹配。提交将被拒绝,直到您进行更新(可能还有合并)来解决此问题。

恢复到修订版不会更改 BASE。它在概念上与手动编辑文件以匹配早期版本几乎相同。


从接受的答案“两个方案的文件内容相同”。那么为什么要打扰呢?这个答案解释了最终的区别,并解释了为什么“更新”与“恢复”在尝试提交时会导致不同的行为。
update torevert to/from 如何处理本地更改(未提交的更改)?
Z
Zac Thompson

之后工作副本中的文件可能看起来完全一样,但它们仍然是非常不同的操作 - 存储库处于完全不同的状态,并且在恢复到“更新”到旧版本之后,您将有不同的选项可供您使用.

简而言之,“更新到”只会影响您的工作副本,但“反向合并和提交”会影响存储库。

如果您“更新”到旧修订版,则存储库没有更改:在您的示例中,HEAD 修订版仍然是 100。您不必提交任何内容,因为您只是在弄乱您的工作副本。如果您对工作副本进行了修改并尝试提交,您将被告知您的工作副本已过期,您需要在提交之前进行更新。如果在同一存储库上工作的其他人执行“更新”,或者如果您签出第二个工作副本,它将是 r100。

但是,如果您“反向合并”到旧修订版,那么您的工作副本仍然基于 HEAD(假设您是最新的)——但是您正在创建一个新修订版来取代不需要的更改。您必须提交这些更改,因为您正在更改存储库。完成后,基于 HEAD 的任何更新或新工作副本都将显示 r101,其中包含您刚刚提交的内容。


p
prime23

将您的工作副本更新为选定的修订版。如果您想让您的工作副本反映过去的某个时间,或者如果对存储库有进一步的提交并且您希望一次更新您的工作副本,这很有用。最好更新工作副本中的整个目录,而不仅仅是一个文件,否则您的工作副本可能会不一致。这用于测试特定的 rev 目的,如果您的测试已经完成,您可以使用此命令测试另一个 rev 或使用 SVN Update 获取 HEAD

如果您想永久撤消之前的更改,请改用“恢复到此版本”。

-- 来自 TSVN 帮助文档

如果您将工作副本更新到较早的版本,这只会影响您自己的工作副本,在您进行一些更改后,想要提交,您将失败,TSVN 会提醒您首先将您的 WC 更新到最新版本 如果您恢复到 rev,你可以提交到存储库。每个人在更新后都会回到 rev。


L
Liker777

乌龟参考中的文字:

将项目更新到修订版 将您的工作副本更新到选定的修订版。如果您想让您的工作副本反映过去的某个时间,或者如果对存储库有进一步的提交并且您希望一次更新您的工作副本,这很有用。最好更新工作副本中的整个目录,而不仅仅是一个文件,否则您的工作副本可能会不一致。

如果您想永久撤消之前的更改,请改用“恢复到此版本”。

恢复到此版本 恢复到较早的版本。如果您进行了几处更改,然后决定您真的想回到修订版 N 中的状态,那么这就是您需要的命令。更改在您的工作副本中被撤消,因此此操作在您提交更改之前不会影响存储库。请注意,这将撤消选定修订后所做的所有更改,将文件/文件夹替换为早期版本。

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

内部发生的是,Subversion 对选定修订后所做的所有更改执行反向合并,撤消那些先前提交的影响。

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

如果您只是想查看文件或文件夹在早期版本中的样子,请使用更新到版本或将版本另存为...。


R
Rishabh Agarwal

@BaltoStar 更新修订语法:

http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.update.html

svn update -r30

其中 30 是修订号。希望这有帮助!