如何撤销 svn 更新?

15

我在工作目录中修改了文件,然后执行了svn更新操作。更新操作没有出现冲突。

我想把工作目录的内容恢复到svn更新之前的状态。

原因是我在共享的svn仓库外还维护着一个本地的git仓库。我忘记在进行svn更新之前提交本地修改。现在我的工作目录包含了本地修改和svn更新的混合修改。如果我提交修改,所有的修改都会被视为一个原子性的变更。我希望它们能够分开。如果我能够撤销更新并且保留svn更新之前的工作目录内容,那么我就可以做到这一点。


我用另一种方法解决了它。本地更改的文件没有受到更新的影响。因此,由于Git阶段机制的帮助,我只提交了本地修改的文件,然后在第二次提交中修改了所有被svn更新修改的其他文件。我很幸运。 - chmike
是的,git stage 是出路。即使文件被影响了,你仍然可以使用 svn diffgit apply 来分离子版本更改和你的更改。 - Jan Hudec
1
无论哪种情况,我都建议将来使用 git-svn。它可以可靠地处理导入和导出修订,并且还可以用作本地补丁队列(您可以在本地分支上有多个提交,并使用交互式变基仅将其中一些提交推送到子版本控制)。 - Jan Hudec
5个回答

17

我一直碰到这个问题,但实际上它并没有提供“如何撤销svn更新?”问题的简单答案。

因此,为了让其他人受益,假设您只是想回滚更新的可解决情况:

首先,请使用以下命令检查日志:

svn log | less

这将为您提供修订版本号(例如957),以便您可以返回。然后:

svn up -r 957

14
这个回答忽略了工作目录被修改的情况。 - Robert Pollak
3
@RobertPollak 但它回答了问题的标题所提出的问题... - ErichBSchulz
2
因为这并没有回答原问题(其中第一句话包含有关修改文件的注释),所以我要点个踩。这将是对另一个问题“如何更新到特定版本”的回答。如果有修改过的文件,这个答案就不起作用了,而且甚至没有提到它。 - Alex Che

5

不可能的。更新之前的状态已经被遗忘了。

您可以通过创建子版本差异,使用 git apply 将其应用到索引中,提交更改,然后再提交所有内容(从拉取获取的更改)来分离更改。

这是一种紧急解决方案。我建议您切换到 git-svn,它将在未来为您处理此类事情。


1
在我看来,这是一个令人难以置信的缺陷!版本控制系统应该让你很难对你的代码库造成永久性的损害。 - Jan M.
1
@JanM,是的,没错!但据我所知,Git是唯一通过reflog提供保护并拒绝使用未提交更改进行非平凡合并的系统。大多数其他系统在更新期间会毫不留情地覆盖修改后的文件,而没有备份合并结果。 - Jan Hudec
@JanM.,公平地说,这并不是对存储库的实际损害,只是在进展中搞砸了工作。 - Jan Hudec

2
执行“升级到版本”操作,这样你就可以将本地文件更改为稳定版本,然后重新提交。这样做会导致所有本地更改丢失。

7
我希望你能翻译这句话:“Loosing all my local changes is what I wanted to avoid.”失去我所有的本地更改是我想避免的。 - chmike
显然,在您的情况下,如果本地更改的文件没有冲突,这个操作是无用的。所以,你很幸运!祝你有美好的一天。 - Joe Taras

0

这是给Linux用户的。

假设修订如下。

Head - 20 前一个版本到head - 18、17、15、14、10、9、8。

进入您的src目录。 使用 svn merge -r 17:18 $url

$url为您的svn基础。


-1
如果在更新过程中发生了任何冲突,您的回收站中将会有一个文件副本和修订文件可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接