【问题标题】:Revert From Revision从修订中恢复
【发布时间】:2010-12-11 11:27:11
【问题描述】:

我正在使用 乌龟 SVN。

我最近签入了一堆代码(一次提交)。在 3 小时的会议上,他们决定废弃我的一堆代码和那个特性。我的老板希望我使用应用程序该区域的旧代码恢复 Subversion。

我会说大约有 3-4 个文件受到影响。在我提交新功能更改的最后一次提交中,我需要将这些文件回滚到我签入它们之前的状态。

所以,我并不真正了解 Revert Back to Revision 的作用。我继续在日志中找到过去提交中这些文件的最新版本,然后右键单击日志中的这些文件并将其恢复为修订版。

现在这会用旧版本完全替换我的本地副本吗?如果我只想返回我上次签入的功能的子集,我这样做是否正确?

那么,一旦我恢复到该文件的本地版本,我是否会丢失所有更改?看起来它将旧代码与我的本地代码合并了......嗯,不完全是我的预期。

(是的,我从 subversion 的文档中阅读了关于它的页面,除了他们简要介绍的技术方式之外,它的含义不是很清楚或彻底在你的工作副本中)

让我们总结一下我所做的:

  1. 我一次检查了一堆更改。
  2. 同事通过 svn update 获取更新
  3. 我们要开会,老板说我们正在删除该功能
  4. 该功能是在该修订版中提交的文件列表中的大约 3-4 个文件
  5. 我想将这些特定文件置于它们之前的状态...有些将恢复为修订版 x,有些则恢复为 y,等等,因为对其中一些文件的最后更改是在不同的修订号上完成的.
  6. 所以我从日志开始。我寻找第一个文件。让我们称之为 somefile1.aspx。我发现该文件的最新版本是在修订版 X 中签入的。所以我在该修订版的更改集中右键单击它并执行恢复到修订版
  7. 我注意到它似乎实际上将该修订版的代码与我的本地副本合并?我想……不知道这就是我摆姿势的原因,因为我不明白这一点。
  8. 我对另外 3 个文件执行相同操作...查找它们最后一次提交的时间并在特定修订版中右键单击它们,然后对它们执行恢复到修订...假设这将放置我的本地版本在那种状态下,甚至我在本地对该文件所做的更改也几乎消失了

但我对这一切有点动摇和困惑。如果我正在接近这个权利,如果我应该使用 revert back 以及它在幕后实际上在做什么。我看到它已经完成了合并但是什么?我只是想将这 4 个特定文件放回以前的状态..不是我刚刚提交的整个提交,我在这里开始提到......只是与特定代码区域相关的特定文件.. rest 可以保持提交并被其他任何人下载。强文本

【问题讨论】:

  • 你能更准确地解释一下你做了什么吗?您使用的是命令行 svn 客户端(如果是,是什么命令)还是特殊的 svn gui 客户端?很难想象,你做了什么。
  • 我正在使用乌龟。我仍然对此感到困惑。我认为我做得对,但不确定。我在最近的提交中右键单击了这些文件并恢复到修订版。它似乎用上一个版本中的代码在本地替换了这些文件,我之前的版本对这些文件进行了最新的更改。
  • Michael Hackner 的描述是一步一步的指导;只要跟着它,你就完成了。在我看来,您并不真正了解 SVN 的工作原理(正如迈克尔所说,SVN 中的措辞在某种程度上具有误导性)......我建议您阅读 SVN 书——整本书,而不仅仅是一节。跨度>

标签: svn tortoisesvn


【解决方案1】:

您可能对我不久前对一个极其相似的问题的回答感兴趣:

How to remove 1 revision of a folder in Subversion

基本上,您最好的行动计划可能是重新检查上一个版本的代码,然后将该代码作为最新版本提交。

如果您发现它正在将旧副本与磁盘上的版本合并,最好的解决方法是删除您的本地副本,然后干净地检查文件的指定修订版。一旦你得到它,你可以重新提交它。

【讨论】:

  • 现在我已经对几个修订文件进行了一些修订,所以我搞砸了?它在本地进行了某种合并,这把我吓坏了。
  • 他与众不同。他想恢复整个修订版。我只想恢复我提交的最新版本的几个文件。
  • 如果我重新检查代码,那我就完蛋了。我不能再使用可能有更新更改的现有工作副本。
  • 这就是重点。从磁盘中删除您搞砸的 4 个文件,然后重新检查它们。从现在到上次签到时,您将失去他们的进度。下一次,更频繁地提交,如果您无法中断构建,请创建一个标签或分支。
【解决方案2】:

假设您想恢复您在修订版 1234 中所做的更改:只需合并从 1234 到 1234-1 的差异。

在 CLI 中,这将是:svn merge -r 1234:1233 http://your-repo/ && svn ci

在 TortoiseSVN 中,得到一个合并对话框,“Merge a range of revisions”,输入 1234 作为要合并的版本,然后单击“Reverse merge”。然后检查您是否没有遇到任何冲突(与其他人在 1234 之后所做的更改),并进行检查。然后您的 HEAD 修订版将没有该代码。

我不确定您是否可以对 TortoiseSVN 中的特定文件执行此操作。我是在 CLI 中完成的,您也可以尝试(CLI 工具、TortoiseSVN、AnkhSVN,它们都共享元数据)。

SVN 仍会记住您编写了这段代码,这就是它的设计目的。如果没有真正的理由从 SVN 中删除此代码(例如,合法或勒索或其他),请保留它。

【讨论】:

  • 我刚刚显示了日志,然后在我的最新版本中,右键单击这些文件并从该版本中还原更改。我猜它看起来像是用该文件的最后一个签入版本替换了它......或者看起来
  • 哦,我用zsh作为我的shell;如果您使用 cmd.exe,您可能需要将该 CLI 行中的 && 更改为不同的内容...
【解决方案3】:

咖啡瘾君子——

revertupdate 在这里都是误导性术语。你没有做这些。您正在“反向合并”更改。

您可以将反向合并视为进行相反的更改...因此,如果修订在文件中添加了一行,则反向合并该更改将从文件中删除该行。

在 TortoiseSVN 中,你这样做的方式是:

  1. 从更新的工作副本开始
  2. 拉起日志
  3. 单击包含要回滚的更改的修订版
  4. 右键单击要回滚的文件,然后选择“还原此修订版的更改”
  5. 对要回滚的每个文件重复第 4 步
  6. 您将看到这会导致对工作副本中的这些文件进行本地修改。这就是你想要的;就像您通过手动编辑文件来撤消更改一样。 但您不会丢失在回滚之后发生的修订的任何更改。
  7. 解决出现的任何冲突
  8. 提交

现在您只撤消了在该版本中发生的更改,而没有丢弃此后您想要保留的任何更改。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2010-11-20
    • 2020-06-04
    • 2018-06-11
    • 2010-11-15
    • 1970-01-01
    • 2021-05-08
    • 2021-09-04
    • 2017-09-16
    相关资源
    最近更新 更多