有时候SVN提交错了,需要回退版本。有时候我们需要暂时切换到之前的某个版本进行调试等。这时候就是需要SVN版本回退功能。
网上对于SVN的版本回退的文章,连内容都是出奇的一致,而且模棱两可,人云亦云。可能是大家用SVN比较少,用命令行的更少,毕竟git是目前做好用的版本控制工具,另外SVN的工具也很好用。
暂时性回退
暂时回退,做完工作后再切换回来。
svn up -r 12494
本质上是将SVN本地代码更新到了某此提交。
之后使用svn update操作还能回到当前最新的提交处。
永久回退
有时候每次提交出错了,我们需要撤销,但是已经提交到了远程,那怎么处理呢,git有reset --hard,svn没有这玩意,svn操作起来比git,还是有点差😂。
SVN需要两步操作:
回退
svn merge -r 12506:12494 /Users/xxx/Documents/xxx/SVN/xxx/xxx_20.03
提交
svn commit -m "revert verison from r12506 to r12494"
做上面的处理之前先将自己的代码update到最新。
详细说明:
首先回退到我们想撤销操作前的那次提交:
svn merge -r 12506:12494 /Users/xxx/Documents/xxx/SVN/xxx/xxx_20.03
上面的操作让SVN从r12506的提交回退到r12494,本质上是将r12506包括r12506这次的提交给撤销了,保留到了r12494处的提交。
后面的是文件路径,我比较懒,直接写了项目的路径,正对整个项目进行回退。也可以正对某个文件或文件夹进行操作。
其次将回退过来的操作提交到远程:
svn commit -m "revert verison from r12506 to r12494"
log记录如下:
回退前的log
------------------------------------------------------------------------r12506 | ZhangSan | -06-18 07:30:45 +0800 (四, 18 6 ) | 2 linesxxxx...------------------------------------------------------------------------r12499 | ZhangSan | -06-17 10:58:15 +0800 (三, 17 6 ) | 2 linesxxxx...------------------------------------------------------------------------r12494 | LiSi | -06-16 09:03:04 +0800 (二, 16 6 ) | 1 linexxxx...------------------------------------------------------------------------
MengXiang的这两次提交需要被撤回,提交有误。也就是说需要回到到LiSi的r12494这次提交。
回退后的log
------------------------------------------------------------------------r12508 | ZhangSan | -06-18 10:23:42 +0800 (四, 18 6 ) | 1 linexxxx...------------------------------------------------------------------------r12506 | ZhangSan | -06-18 07:30:45 +0800 (四, 18 6 ) | 2 linesxxxx...------------------------------------------------------------------------r12499 | ZhangSan | -06-17 10:58:15 +0800 (三, 17 6 ) | 2 linesxxxx...------------------------------------------------------------------------r12494 | LiSi | -06-16 09:03:04 +0800 (二, 16 6 ) | 1 linexxxx...------------------------------------------------------------------------
从log上看,SVN会生成一个新的提交r12508,因为我们重新commit了,而且保留了需要被撤销的两次提交。而且回退后,代码重新回到了r12494这次提交的内容。