ChatGPT解决这个技术问题 Extra ChatGPT

恢复到文件以前的 SVN 版本的更好方法?

svn

我不小心将太多文件提交到 SVN 存储库,并更改了一些我不想做的事情。 (叹气。)为了将它们恢复到以前的状态,我能想到的最好的方法是

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

天哪!没有更好的办法吗?为什么我不能写这样的东西:

svn revert -r 854 l3toks.dtx

好的,我只使用 v1.4.4,但我浏览了 1.5 分支的更改列表,我看不到任何与此直接相关的内容。我错过了什么吗?

编辑:我想我不够清楚。我不认为我想反向合并,因为那样我将失去我确实想要进行的更改!假设 fileAfileB 都被修改了,但我只想提交 fileA;不小心打字

svn commit -m "small change"

提交这两个文件,现在我想回滚 fileB。反向合并使这项任务(据我所知)并不比我上面概述的步骤更容易。

How do I revert an SVN commit? 的可能重复项

o
orip
svn merge -r 854:853 l3toks.dtx

或者

svn merge -c -854 l3toks.dtx

两个命令 are equivalent


谢谢你,只是想说明一些事情 - 比如说,我在修订版 855,我想将文件恢复到修订版 854。如果我先执行 svn merge -c -854 my.file,然后执行 svn diff,它似乎之前显示了一个修订版854(即853);只有当我执行 svm merge -c 854 myfile(没有 -)时,myfile 看起来才恢复到 rev 854。再次感谢,干杯!
为什么上面的第一个选项对我来说就像一个魅力,而第二个选项根本不起作用?
不过,不要忘记在反向合并后提交。我经常忘记:)
真的应该减去 1,因为没有说明这两个命令之间的区别是什么。不好的答案
@sprog - 如果有区别,我会很高兴知道
m
mmcdole

查看 svn book 的“undoing changes”部分


鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
s
sdaau

很抱歉仅重复先前给出的答案就占用了一些空间-但这是我总是遇到麻烦的事情。

假设我已将本地文件更新为最新版本,即 854。然后,我想获得一个较旧的版本 - 早期版本的文件版本,例如版本 851。

复制会起作用:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. 但是,我不会为回购 URL 烦恼 :)

更新似乎可能有效:

svn up -r 851 ./l3toks.dtx

...但是,它还将本地副本标记为“新签出”,或者更确切地说“与在线修订版相同”(即在 Tortoise/RabbitVCS 中,您会得到一个绿色的 OK 复选标记)——这意味着您不能执行 svn ci -m "rolled back to r 851":只需因为本地 subversion 可执行文件不会注意到任何本地更改,也不会费心将任何内容上传到在线存储库。

而且,正如已经回答的那样,反向合并有效——但在这种情况下,不应该依赖快捷语法;但具体说明:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

我必须承认——我永远不会理解“将 r854 到 r852 反向合并到文件中”这句话的意思是“刚刚得到你的文件的 r851,并覆盖了你以前在本地拥有的任何东西——它被标记为与最新的在线修订不同,所以您可以将其作为新的“回滚”修订版重新在线查看”,但我想(并希望 :))这就是它的作用 :)

在此之后,可以使用 svn diff 快速确认我们是否在本地获得了正确的修订;而且,该文件在 Tortoise/RabbitVCS 中会用红色感叹号标记(即与最新提交的版本不同),因此 svn ci -m "rolled back to r 851" 这次可以运行。

另外,请注意,如果您最终在反向合并后改变主意(即您无论如何都想继续处理最新的 HEAD 修订版,这里是 854 - 在您在本地回滚到 851 之后,但还没有提交回滚),您不应该使用 svn up,因为它只会说它已经是“在修订版 854”;改用 svn revert --recursive . 或类似...

干杯!

参考:How to Roll Back Changes using Subversion - Jacob Wright – Flex, AIR, PHP, etc.

编辑:...显然,与 svn merge -r HEAD:851 l3toks.dtx 完全相同的效果可以通过以下方式实现:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

您应该总是更喜欢 svn export,因为它完全符合您的要求 - 在某个修订版中签出文件,而反向合并也会尝试将您的本地更改与指定版本合并,这是一个复杂而疯狂的操作,这是一不小心就容易出错!
我遇到了反向合并的问题。我没有弄清楚原因,而是尝试了导出,并且效果很好。我强烈建议只使用导出。您可以使用 --force 覆盖目录。请记住,它将覆盖任何更改。
关于实际发生的事情的很好的解释!我经常使用 AnkhSVN 和 TortoiseSVN,但我看不到任何地方可以使用 svn export - 我是否遗漏了某些东西,或者只是没有在这些 GUI 中实现?
@Conrad,您可以通过从存储库上下文(右键单击)菜单中单击 AnkhSVN 中的“导出...”和 TortoiseSVN 中的“导出”来使用它
I
Igor

我最近不得不恢复到特定版本来调试旧版本,这就像魔术一样:

svn up -r 3340 (or what ever your desired revision number)

我必须使用“tc”选项解决所有冲突,因为我不关心本地更改(在还原之前检查了我关心的所有内容)

重新开始修订也很简单:

svn up

r
rmeador

您正在寻找的内容称为“反向合并”。您应该查阅有关 SVN 书中合并功能的文档(正如 luapyad,或者更准确地说,该帖子的第一个评论者指出的那样)。如果您使用的是 Tortoise,您也可以直接进入日志视图并右键单击并在您犯错的地方选择“恢复此修订版的更改”。


T
Tom

反向合并正是您想要的(请参阅 luapyad 的答案)。只需将合并应用于错误提交的文件而不是整个目录。


N
Nakilon

如果只想撤消上次签入,可以使用以下

svn merge -r head:prev l3toks.dtx

这样,您就不必寻找当前和以前的版本号。


D
Dylan

svn merge 将合并修订,而不是还原它们。即,如果您在 HEAD 版本中添加了一些内容,然后将其与以前的版本合并,那么更改将持续存在。

我使用 svn cat 然后将其重定向到文件中:

svn cat -r 851 l3toks.dtx > l3toks.dtx

然后您在该文件中有 851 内容,并且可以将其重新检入。


c
ceiroa

如果您使用带有 SVN 插件的 Eclipse IDE,您可以执行以下操作:

右键单击要还原的文件(或它们所在的文件夹,如果您错误地删除了它们并且想要将它们添加回来)选择“团队>切换”选择“修订”单选按钮,然后输入您要恢复到的修订号。单击确定转到同步透视图选择要还原的所有文件右键单击选择并执行“覆盖并提交...”

这会将文件还原为您想要的版本。请记住,SVN 会将更改视为新提交。即变更得到一个新的修订号,旧修订和新修订之间没有联系。您应该在提交注释中指定您将这些文件恢复到特定修订版。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅