我正在和朋友一起开展一个项目,想要回到我们代码的早期版本,并将其设置为当前版本。我该怎么做?
我正在使用vs08上的"anksvn"。
我在我的电脑上拥有我想要的版本,但提交失败了。我得到的消息是“提交失败,文件或目录已经过期。”
我也在我的电脑上安装了subversion客户端。
基本上你需要“向后合并”-将当前版本和上一个版本之间的差异(diff) 应用于当前版本(这样你就可以得到一个看起来像旧版本的工作副本),然后再次提交(commit)。所以例如,要从版本150(当前版本)返回到版本140:
svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"
Subversion红皮书中有一个很好的章节介绍了这个。
你只能在subversion历史记录的头部提交新更改。
不能直接使用计算机上的优秀副本,因为它的.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 -m "Reverted to revision 123"
(与Jon Skeet上面的答案相同)
如果您找不到旧版本,而您只想提交当前电脑上的文件:
复制您的好版本(但不带任何.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 -m "Reverted to good copy"
svn merge -r HEAD:revnumber
时,会出现“需要合并源”的提示。 - Kevin Crum只需使用此行命令:
svn update -r 你的旧版本号
你可以通过以下命令知道当前的版本号:
svn info
如果您想撤销整个检入,使用合并的标准方法非常有效。但有时候,您只想还原单个文件。没有正当的方法可以实现,但有一种技巧:
使用svn导出子命令:
svn export http://url-to-your-file@123 /tmp/filename
(其中123是文件好版本的修订号。)然后将该单个文件移动或复制以覆盖旧文件。检入修改后的文件,完成操作。
svn
也应该有一种方法来实现这个功能吧? - lc.有点老派
svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch
svn diff
svn commit
我认为这是最合适的方法:
反向合并,例如,如果提交的代码包含从rev 5612到5616的修订版本,只需向后合并即可。在我的环境中可以正常工作。
例如:
svn merge -r 5616:5612 https://<your_svn_repository>/
这将包含一个合并的代码返回到先前的版本,然后您可以提交它。
这个页面上有很多危险的回答。需要注意的是,自从SVN版本1.6以来,执行update -r命令可能会导致树冲突(tree conflicts),并迅速升级为潜在的数据丢失问题,就像卡夫卡式噩梦一样,你需要在Google上搜索有关树冲突的信息。
恢复到某个版本的正确方法是:
Original Answer翻译成"最初的回答"svn merge -r HEAD:12345 .
右键单击您想要还原的最高层次结构 >> 还原
或 还原到版本
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"
svn merge -r HEAD:140
。 - sschmeck