如何还原SVN提交?


303

我发现了各种如何还原SVN提交的示例,例如

svn merge -r [current_version]:[previous_version] [repository_url]

要么

svn merge -c -[R] .

但是它们似乎都不起作用。我尝试了这些命令,并检查了手动更改的文件。

如何还原修订号为1944的提交?如何检查恢复已完成(不查看实际文件中的更改是否已恢复)?


16
您是否从未接受答案,因为他们都不起作用?
2rs2ts 2014年

4
如果要字面答案,请使用“ svn merge -c -1944”。要检查它是否有效:“ svn diff”
约翰·桑普森



如果是这样的话,我有1943(良好提交),然后是1944(不良提交),然后是1945(良好提交),然后是1946(良好提交)。现在我只想删除1944(错误提交)并在1944年之后保留所有修订,这意味着我希望从所有这些修订中得到类似1943、1945、1946(仅删除1944)的结果,我该怎么办?
Bhavin_m

Answers:


447

这两个例子都必须起作用,但是

svn merge -r UPREV:LOWREV . 撤消范围

svn merge -c -REV . 撤消单个修订

用这种语法-如果当前目录是WC并且(如每次合并后必须完成),您将提交结果

您要查看日志吗?


9
@dwjohnston-是的,合并总是在WC中执行,而不是服务器端任务
Lazy Badger

14
svn: Merge source required。没有骰子。
2014年

27
@ 2rs2ts看起来您忘记了尾随点来指定“在当前目录中执行此操作”。
大林

14
您还可以同时进行多个单次提交:svn merge -c -42587,-42589 .
mlathe 2014年

1
@ahnbizcad-您想要撤消的修订版(单个)
Lazy Badger

130

如果您使用的是TortoiseSVN客户端,则可以通过“显示日志”对话框轻松完成。


5
这是迄今为止最简单的方法来做到这一点
马尔K.

5
这已经过时了。当前版本的客户端不再具有上下文菜单。
user1789573

19
什么?TortoiseSVN是一个上下文菜单,以及它产生的对话框。“不再存在上下文菜单”是什么意思?最肯定的是!

@Ben我认为user1789573对于答案中链接到的教程中对“上下文菜单”的明确提及有些不慎。
汤姆·卡图洛

2
以防您稍后看到它,它仍然在那儿。在显示日志屏幕中,右键单击修订,然后有一个“还原到此修订”选项。这是在TortoiseSVN 1.9.4 Build 27285中。我刚刚使用它,可以告诉您它工作正常。
Bruce Van Horn

64

svn merge -r 1944:1943 .应该在您的工作副本中还原r1944的更改。然后,您可以查看工作副本中的更改(使用diff),但是需要提交才能将还原应用于存储库。


4
不起作用,需要合并源。试过了svn merge -r 1944:1943 .,但是什么都没有改变。
Alex

自r1944以来,存储库是否已升级?如果是这样,与r1943和r1944之间的变化是否在同一行上存在冲突的变化?
onon15 2011年

我的修订版是1945年,似乎没有冲突。无论是svn status也不svn diff给任何东西。
亚历克斯(Alex)

7
错误:svn: Try 'svn help' for more info svn: Merge source required
Alex

5
svn merge -r 1945:1943 .似乎奏效了。我想我理解:您需要将“错误”提交之前的版本合并到工作存储库中。如果您想对上一次提交进行简单的“还原”,就可以了。但是,如果要还原对1900版所做的更改,该怎么办?
Alex

44

首先,将工作副本还原为1943年。

> svn merge -c -1943 .

其次,检查即将提交的内容。

> svn status

第三,提交1945版。

> svn commit -m "Fix bad commit."

第四,查看新日志。

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
如果是这样的话,我有1943(良好提交),然后是1944(不良提交),然后是1945(良好提交),然后是1946(良好提交)。现在我只想删除1944(错误提交)并在1944年之后保留所有修订,这意味着我希望从所有这些修订中得到类似1943、1945、1946(仅删除1944)的结果,我该怎么办?
Bhavin_m

26

不可能“取消提交”修订,但是您可以将工作副本还原为1943版并将其提交为1945版。1943和1945版将是相同的,从而有效地还原了更改。


18
只是为了令人讨厌的准确,我要评论一下,如果您对存储库具有管理员访问权限,则可以“取消提交”。通过使用svn dump,然后创建一个给定修订版本的克隆存储库svn load。但是,当然,在正常情况下不应使用此功能。
onon15 2011年

4
我不想取消提交,我想创建一个新的提交编号,其中某个提交相反。有人说我已经签出1944年的版本,并于1945年提交了一份报告,我想对其进行“还原”。然后,我想要一个版本1946,其文件与版本1944中的文件相同。(当然,历史除外。)但问题仍然是:该怎么做?命令是什么?
亚历克斯(Alex)

//,@Alex,我对此也很感兴趣,尤其是在类似的东西上$ git revert。我发现使用Git这么长时间后学习SVN有点困难。
内森·巴桑尼斯

9

正如下面所说,下面将进行空运行。HEAD是当前版本,PREV是先前版本,然后是文件或已提交项目的路径:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

如果空运行看起来不错,请运行不带--dry-run的命令

验证修订中的更改并重新提交。要浏览版本号,请尝试:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

这是否要求本地副本与不良修订版本不同?
Eliezer Miron

2

亚历克斯,试试看:svn merge [WorkingFolderPath] -r 1944:1943


2

尽管已经给出的建议可能对某些人有用,但对我的情况却不起作用。执行合并时rev 1443,更新为的用户rev 1445仍会同步所有更改的文件,1444即使它们等于1443合并中的文件。我需要最终用户完全看不到更新。

如果要完全隐藏提交,可以通过以正确的修订版本创建新分支,然后交换分支来实现。唯一的事情是您需要删除并重新添加所有锁。

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

这对我有用,也许会对那里的其他人有帮助=)


2
svn merge -c -M PATH

这救了我一命。

我也遇到了同样的问题,回退后也没有看到旧代码。运行上面的命令后,我得到了一个干净的旧版本代码。


1

我尝试了上面的(svn merge),您说对了,它确实可以插口。然而

svn update -r <revision> <target> [-R]

似乎有效,但不是永久性的(我的svn只是显示旧版本)。所以我不得不

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

在我的特定情况下,我的目标是interfaces/AngelInterface.php。我对文件进行了更改,提交了它们,更新了构建计算机,运行了phpdoc编译器,发现我的更改浪费了时间。 svn log interfaces/AngelInterface.php将我的更改显示为r22060,并且对该文件的上一次提交是r22059。因此,我可以svn update -r 22059 interfaces/AngelInterface.php并且最终得到与-r22059中相同的代码。然后 :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

另外,我可以在目录中执行相同的操作,方法. -Rinterfaces/AngelInterface.php在所有上述内容中指定。


1
正如已经说过的,另一件事是,您不能从历史记录中删除提交,就像您可以通过直接破解参考文件在git中进行操作一样。您所能做的就是使用存储库将源更改为预期的方式,并将其作为更改提交。
sibaz 2014年

经过进一步调查,我发现可以使用svnadmin从历史记录中删除提交,但是强烈建议您不要这样做。见stackoverflow.com/questions/5566327/...
sibaz

0

如果要从历史记录中完全删除提交,也可以对特定版本的存储库进行转储,然后导入该转储。特别:

svnrdump dump -r 1:<rev> <url> > filename.dump

svnrdump命令执行与svnadmin dump相同的功能,但可以在远程仓库上使用。

接下来,只需将转储文件导入您选择的存储库即可。经过测试,在Beanstalk上运行良好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.