我已经开始使用带有 TortoiseSVN 的 Subversion。如果我打开日志并右键单击旧版本,我会看到两个听起来像是回滚到旧版本的选项:“将项目更新到版本”和“恢复到此版本”。
我知道当您只想回顾旧版本但不想真正更改存储库时,会使用更新到旧版本。 Revert 是当您真正搞砸并希望存储库中的最新版本与旧版本相同时。
所以说 HEAD 修订版是 100,我恢复到 95。它会将我的工作副本反向合并回 95。然后我可以将该更改提交到将创建修订版 101 的存储库对吗?如果我要更新回修订版 95,那有什么不同?它不仍然只是扭转上次修订的变化吗?我对在还原或更新到旧版本后工作副本的状态有何不同感到困惑。
更新到修订版只会将您的工作副本的文件更新到您选择的修订版。但是你不能继续在这个版本上工作,因为 SVN 会抱怨你的工作副本已经过时了。
恢复到此修订版将撤消在选定修订版之后所做的工作副本中的所有更改(在您的示例中 rev. 96,97,98,99,100) 您的工作副本现在处于修改状态。
两个方案的文件内容是相同的,但是在第一种情况下,您有一个未修改的工作副本并且您无法提交您的更改(因为您的工作副本不指向 HEAD rev 100)在第二种情况下,您有一个修改后的工作副本指向 head 和你可以继续工作并承诺
要了解您的工作副本的状态在这两种情况下有何不同,您必须了解 BASE revision 的概念:
BASE 工作副本中项目的修订号。如果项目已在本地修改,这是指项目在没有这些本地修改的情况下显示的方式。
您的工作副本包含此 BASE 修订版中每个文件(隐藏在 .svn 文件夹中)的快照,这意味着与上次从存储库中检索时一样。这解释了为什么工作副本占用 2 倍的空间,以及如何在没有网络连接的情况下检查甚至恢复本地修改。
Update item to Revision 会更改此基础修订版,使 BASE 过时。当您尝试提交本地修改时,SVN 会注意到您的 BASE 与存储库 HEAD 不匹配。提交将被拒绝,直到您进行更新(可能还有合并)来解决此问题。
恢复到修订版不会更改 BASE。它在概念上与手动编辑文件以匹配早期版本几乎相同。
update to
和 revert to/from
如何处理本地更改(未提交的更改)?
之后工作副本中的文件可能看起来完全一样,但它们仍然是非常不同的操作 - 存储库处于完全不同的状态,并且在恢复到“更新”到旧版本之后,您将有不同的选项可供您使用.
简而言之,“更新到”只会影响您的工作副本,但“反向合并和提交”会影响存储库。
如果您“更新”到旧修订版,则存储库没有更改:在您的示例中,HEAD 修订版仍然是 100。您不必提交任何内容,因为您只是在弄乱您的工作副本。如果您对工作副本进行了修改并尝试提交,您将被告知您的工作副本已过期,您需要在提交之前进行更新。如果在同一存储库上工作的其他人执行“更新”,或者如果您签出第二个工作副本,它将是 r100。
但是,如果您“反向合并”到旧修订版,那么您的工作副本仍然基于 HEAD(假设您是最新的)——但是您正在创建一个新修订版来取代不需要的更改。您必须提交这些更改,因为您正在更改存储库。完成后,基于 HEAD 的任何更新或新工作副本都将显示 r101,其中包含您刚刚提交的内容。
将您的工作副本更新为选定的修订版。如果您想让您的工作副本反映过去的某个时间,或者如果对存储库有进一步的提交并且您希望一次更新您的工作副本,这很有用。最好更新工作副本中的整个目录,而不仅仅是一个文件,否则您的工作副本可能会不一致。这用于测试特定的 rev 目的,如果您的测试已经完成,您可以使用此命令测试另一个 rev 或使用 SVN Update 获取 HEAD
如果您想永久撤消之前的更改,请改用“恢复到此版本”。
-- 来自 TSVN 帮助文档
如果您将工作副本更新到较早的版本,这只会影响您自己的工作副本,在您进行一些更改后,想要提交,您将失败,TSVN 会提醒您首先将您的 WC 更新到最新版本 如果您恢复到 rev,你可以提交到存储库。每个人在更新后都会回到 rev。
乌龟参考中的文字:
将项目更新到修订版 将您的工作副本更新到选定的修订版。如果您想让您的工作副本反映过去的某个时间,或者如果对存储库有进一步的提交并且您希望一次更新您的工作副本,这很有用。最好更新工作副本中的整个目录,而不仅仅是一个文件,否则您的工作副本可能会不一致。
如果您想永久撤消之前的更改,请改用“恢复到此版本”。
恢复到此版本 恢复到较早的版本。如果您进行了几处更改,然后决定您真的想回到修订版 N 中的状态,那么这就是您需要的命令。更改在您的工作副本中被撤消,因此此操作在您提交更改之前不会影响存储库。请注意,这将撤消选定修订后所做的所有更改,将文件/文件夹替换为早期版本。
如果您的工作副本处于未修改状态,则执行此操作后,您的工作副本将显示为已修改。如果您已经有本地更改,此命令会将撤消更改合并到您的工作副本中。
内部发生的是,Subversion 对选定修订后所做的所有更改执行反向合并,撤消那些先前提交的影响。
如果在执行此操作后您决定要撤消撤消操作并将工作副本恢复到之前的未修改状态,则应在 Windows 资源管理器中使用 TortoiseSVN → Revert,这将丢弃此反向合并操作所做的本地修改。
如果您只是想查看文件或文件夹在早期版本中的样子,请使用更新到版本或将版本另存为...。
@BaltoStar 更新修订语法:
http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.update.html
svn update -r30
其中 30 是修订号。希望这有帮助!
update to
和revert to/from
如何处理本地更改(未提交的更改)?