337

I have found various examples of how to revert an SVN commit like

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

or

svn merge -c -[R] .

But neither of them seems to work. I tried those commands and checked the files that were changed by hand.

How do I revert a commit with revision number 1944? How do I check that the revert has been done (without looking in the actual file to the changes have been reverted)?

4

14 回答 14

476

这两个例子都必须有效,但是

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

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

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

你想看日志吗?

于 2012-11-11T11:12:48.290 回答
138

如果您使用TortoiseSVN客户端,可以通过 Show Log 对话框轻松完成。

于 2013-09-24T05:16:55.557 回答
71

svn merge -r 1944:1943 .应该恢复工作副本中 r1944 的更改。然后,您可以查看工作副本中的更改(使用差异),但您需要提交才能将恢复应用到存储库中。

于 2012-11-11T09:53:39.287 回答
51

首先,将工作副本恢复到 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.
------------------------------------------------------------------------
于 2015-04-21T02:25:21.817 回答
26

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

于 2012-11-11T10:00:57.193 回答
10

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

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

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

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

svn log
于 2014-03-26T03:49:46.440 回答
5
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
于 2013-10-01T12:18:42.997 回答
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>

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

于 2014-11-04T22:27:52.227 回答
2

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

于 2013-06-26T10:26:59.193 回答
2
svn merge -c -M PATH

这救了我的命。

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

于 2016-09-08T13:47:46.577 回答
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

或者,我可以在目录上做同样的事情,通过指定. -R代替interfaces/AngelInterface.php上述所有内容。

于 2014-09-05T15:30:02.460 回答
1

如果您想从历史记录中完全删除提交,您还可以在特定修订版处转储 repo,然后导入该转储。具体来说:

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

svnrdump 命令执行与 svnadmin dump 相同的功能,但适用于远程存储库。

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

于 2017-03-15T22:48:08.497 回答
0

非常旧的线程,但是 Intellij 没有答案。要恢复单个提交:

转到:Subversion -> 集成目录...

集成目录视图

于 2021-01-27T11:04:19.657 回答
0

请注意,该svn merge命令会恢复一个提交,即让另一个提交撤消您的更改,但将您的错误提交保留在历史记录中。

如果您是 Subversion 系统管理员(具有命令行访问权限)并且您必须恢复一个非常大的错误(例如,某人犯了在世界上无缘无故犯下的事情),并且如果您想尝试不惜一切代价完全放弃提交,即使有破坏回购的风险:

步骤 1. 在您的服务器上识别您的存储库

首先在您的服务器文件系统上识别您的存储库。

假设路径名是/repo. 但它可能是/home/svn/myrepo或类似的东西。

文件系统结构应该是这样的:

$ ls -la /repo
total 16
drwxr-xr-x.   6 svn svn   86 10 feb  2020 .
drwxrwx---. 145 svn svn 4096 22 giu 16.14 ..
drwxr-xr-x.   2 svn svn   54 10 feb  2020 conf
drwxr-sr-x.   6 svn svn  253 17 giu 11.25 db
-r--r--r--.   1 svn svn    2 10 feb  2020 format
drwxr-xr-x.   3 svn svn 4096 10 feb  2020 hooks
drwxr-xr-x.   2 svn svn   41 10 feb  2020 locks
-rw-r--r--.   1 svn svn  229 10 feb  2020 README.txt

我们还假设您的用户svn像上面的示例一样被调用。

注意:如果你不知道这是在说什么,你可能没有自己的 Subversion 服务器,这个答案可能对你的情况没有用。请尝试其他答案(您只需要拥有服务器的 URL,无需物理访问)。

第 2 步。导出您的良好历史记录

让我们假设您的错误版本是100并且您的正确版本是99

svnadmin dump -r 1:99 /repo > export.dump

步骤 3. 备份并重新初始化您的存储库

创建存储库的备份并再次对其进行初始化:

mv              /repo /repo.bak
mkdir           /repo
svnadmin create /repo

步骤 4. 再次导入您的良好历史记录

svnadmin load /repo < export.dump

现在,确保使用正确的用户修复您的权限:

chown -R svn:svn /repo

一切正常吗?就这样!对你有益!

但是在这一点上,您很有可能已经破坏了整个存储库。例如,您可能不再能够结帐,或者您的 Subversion Web 应用程序(Phabricator?)可能会发出奇怪的错误消息,或者您可能在此过程中误杀了一千只小猫。

如果出现问题,请为灾难恢复做好准备:

灾难恢复

如果发生灾难:

mv /repo     /repo.fail
mv /repo.bak /repo

希望有用。

于 2021-06-28T10:52:53.037 回答