Answers:
基本上,您需要“向后合并”- 在当前版本和先前版本之间应用差异到当前版本(这样您最终得到的工作副本看起来就像旧版本一样),然后再次提交。例如,从修订版150(当前)回到修订版140:
svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"
《 Subversion红皮书》对此有很好的介绍。
svn merge -r HEAD:140
。
您只能在Subversion历史记录的顶部提交新更改。
您无法直接对PC上的优质副本执行任何操作的原因是,其.svn
文件夹知道它是过去的代码,因此在提交之前需要进行更新。
查找所需的旧副本的修订号。
通过以下方式获取当前版本:
svn info --show-item revision
# or
svn log
或要检查项目的旧版本,请使用:
svn update -r <earlier_revision_number>
直到找到正确的修订号。
记下好的修订号(假设123
下面的示例)。
更新到最新版本:
svn update
撤消您想要的修订和最新版本之间的所有更改:
svn merge -r HEAD:123 .
svn commit "Reverted to revision 123"
(与上述乔恩·斯基特的答案相同。)
如果找不到旧副本,而只想提交当前在PC上的文件:
制作一个好版本的副本(但不带任何.svn
文件夹):
cd ..
rsync -ai --exclude=.svn project/ project-good/
现在确保您具有最新版本:
cd project
svn update
# or make a fresh checkout
svn checkout <url>
将好的版本复制到工作副本的顶部。
此命令将进行复制,并从工作树中删除所有不在您的良好副本中的文件,但不会影响现有.svn
文件夹。
cd ..
rsync -ai --exclude=.svn --delete project-good/ project/
如果没有rsync,则可以使用,cp -a
但还需要手动删除所有不需要的文件。
您应该能够落实您现在拥有的东西。
cd project
svn commit "Reverted to good copy"
只需使用此行
svn update -r yourOldRevesion
您可以使用以下方法了解您的当前修订:
svn信息
如果您要这样做,则使用合并撤消整个签入的标准方法非常有用。但是有时候,您要做的只是还原单个文件。没有合法的方法可以做到这一点,但是有一个hack:
使用svn的export子命令:
svn导出http:// url-to-your-file @ 123 / tmp / filename
(其中123是该文件的正确版本的修订号。)然后移动或复制该单个文件以覆盖旧文件。签入修改后的文件,即可完成操作。
svn
吗?
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
先前的大多数答案都是使用反向合并,通常这是正确的答案。但是,有一种情况(只是发生在我身上)没有。
进行小的更改时,我不小心将Unix行尾的文件更改为DOS行尾,并提交了它。通过更改行尾并再次提交或通过反向合并,可以很容易地撤消此操作,但是这样做的效果是使svn blame
我的编辑列表成为文件每一行的源。(有趣的是,Windows上的TortoiseSVN不受此影响;仅受命令行影响svn blame
。)
如果您想保留所报告的历史记录svn blame
,我认为您需要执行以下操作:
删除有些吓人,但请记住您始终将文件保存在存储库中,因此恢复它并不是什么大问题。这是一些代码来说明这些步骤。假定这xxx
是最后一个好的副本的修订版号。
svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"
请注意,对于存储库中的副本,目标位置必须是目录,而不是文件名。
乔恩·斯凯特(Jon Skeet)的答案简而言之就是解决方案,但是,如果您像我一样,可能需要一个解释。Subversion手册将此称为
从手册页。
这种形式称为“樱桃选择”合并:“ -r N:M”是指修订版N和M之间源分支历史记录中的差异。
“反向范围”可用于撤消更改。例如,当源和目标引用同一分支时,可以“撤消”先前提交的修订。在反向范围内,N大于'-r N:M'中的M,或者'-c'选项使用负数:'-c -M'等效于'-r M:'。取消这样的更改也称为执行“反向合并”。
如果源是文件,则差异将应用于该文件(对于反向合并先前的更改很有用)。否则,如果源是目录,则目标默认为“。”。
在正常使用中,工作副本应该是最新的,并且是单个修订版,没有本地修改,也没有切换的子树。
例:
svn merge -r 2983:289 path/to/file
这将用服务器的修订版289替换本地副本[2983](根据上面的引用应与服务器同步-由您负责)。更改在本地进行,这意味着如果您有完整的签出,则可以在提交更改之前对其进行检查。