如何在Subversion中返回到代码的旧版本?

我正在和一个朋友一起做一个项目,我想返回到我们代码的旧版本,并将其设置为当前版本。我该怎么做?

我在vs08上使用“anksvn”。

我在我的PC上有我想要的版本,但提交失败;我得到的信息是 "提交失败,文件或目录已过期。"< / p >

我的电脑上也有subversion客户端。

713647 次浏览

同步到旧版本并提交。这应该能奏效。

这是也是撤销更改的解释。

基本上你需要“向后合并”-在当前版本和以前版本之间应用一个差异当前版本(因此你最终会得到一个看起来像旧版本的工作副本),然后再次提交。例如,从150版(目前)回到140版:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

颠覆红皮书有一个这一节讲得很好

右键单击要还原>> RevertRevert to Revision的最高层次结构

你只能在颠覆历史的处提交新的更改。

你不能直接对你电脑上的好拷贝做任何事情的原因是,它的.svn文件夹知道它是过去的代码,所以在提交之前需要更新。

找到好的修订号并恢复

  1. 找到你想要的旧版本的修订号。

    获得你的当前的修订:

    svn info --show-item revision
    # or
    svn log
    

    或者检查项目的版本,使用:

    svn update -r <earlier_revision_number>
    

    直到你找到正确的修订号。

  2. 记下好的修订号(下面的例子假设123)。

  3. 最新版本:

    svn update
    
  4. 撤销你想要的版本和最新版本之间的所有更改:

    svn merge -r HEAD:123 .
    svn commit -m "Reverted to revision 123"
    

    (和上面乔恩·斯基特的回答一样)

如果你找不到修订号

如果你找不到旧的副本,你只想提交当前在你的电脑上的文件:

  1. 复制你的好版本(但没有任何.svn文件夹):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. 现在确保你有最新的版本:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. 将你的好版本复制到工作副本的顶部。

    这个命令将复制并删除工作树中没有在你的良好副本中的任何文件,但它不会影响现有的.svn文件夹。

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    如果你没有rsync,你可以使用cp -a,但你也需要手动删除任何不需要的文件。

  4. 你应该能够提交你现在拥有的东西。

    cd project
    svn commit -m "Reverted to good copy"
    

使用merge来撤销整个签入的标准方法非常有效,如果这是您想要做的。不过,有时您所要做的只是还原单个文件。没有合法的方法来做到这一点,但有一个hack:

  1. 使用svn log查找需要的版本。
  2. 使用svn的export子命令

    svn export http://url-to-your-file@123 /tmp/filename

    .使用实例

(其中123是文件良好版本的修订号。)然后移动或复制该文件以覆盖旧文件。签入修改后的文件,就完成了。

就用这条线

svn update -r yourOldRevesion

您可以使用以下命令了解您的当前版本:

svn的信息

我认为这是最合适的:

例如,如果提交的代码包含from的修订,则反向合并 5612到5616版本,倒着合并。

例如:

svn merge -r 5616:5612 https://<your_svn_repository>/

它将包含一个合并的代码回到以前的修订,然后您可以提交它。

有点老派

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

然后是通常的

svn diff
svn commit

这就是我所做的,为我工作。

我想撤消在多次提交中所做的更改,并希望转到以前的提交点。

  1. 去团队->显示历史。
  2. 右键单击要忽略的修订或范围。
  3. 选择“恢复更改”选项。

这将运行反向合并,撤销工作副本中的更改。

只需检查代码并提交即可。

下面的方法对我很有效。

我有很多本地更改,需要在本地副本中丢弃这些更改,并在SVN中签出最后的稳定版本。

  1. 检查所有文件的状态,包括被忽略的文件。

  2. Grep所有行以获取新添加和忽略的文件。

  3. 将这些替换为//

  4. rm -rf所有的行。

    svn status --no-ignore | grep '^[?I]' |  sed "s/^[?I] //" | xargs -I{} rm -rf "{}"
    

右键单击项目>替换为>修订或URL >选择要恢复的特定修订。

现在将本地更新代码版本提交到存储库。这将把代码库恢复到特定的修订版本。

以前的大多数答案都是使用反向合并,这通常是正确的答案。然而,有一种情况(刚刚发生在我身上)却不是这样。

我不小心将一个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"

注意,对于存储库中的副本,目标需要是目录,而不是文件名。

乔恩·斯基特的回答基本上就是一个简单的解决方案,但如果你和我一样,你可能想要一个解释。Subversion手册将其称为

择优挑选合并

从手册页。

    这个表单被称为'cherry-pick' merge: “-r N:M”指的是历史上的差异

    “反向范围”可用于撤销更改。例如,当 源和目标引用同一个分支,即先前提交的分支 复习可以“撤消”。在反向范围中,N大于M '-r N:M',或者'-c'选项与负数一起使用:'-c -M' 等价于'-r M:'。撤消这样的更改也是众所周知的

    .


  • 如果源是一个文件,则对该文件应用差异 文件(用于反向合并早期更改)。否则, 如果源文件是一个目录,那么目标文件默认为'.' 在正常使用情况下,工作副本应该是最新的

例子:

svn merge -r 2983:289 path/to/file

这将用来自服务器的修订289替换本地副本[2983](根据上面的引用,它应该与服务器同步—您的责任)。更改发生在本地,这意味着如果您有一个干净的签出,那么可以在提交更改之前检查更改。

这页上有很多危险的答案。请注意,从SVN版本1.6开始,执行更新-r可能会导致树冲突,这将迅速升级为可能丢失数据的kafkeresque噩梦,您需要在谷歌上搜索关于树冲突的信息。

恢复版本的正确方法是:

svn merge -r HEAD:12345 .

其中12345是版本号。别忘了这个点。