理解 Darcs/撤销错误
有许多方法可以删除内容:remove、rollback、revert、obliterate、unpull、unrecord... 几乎让人觉得太多了。其中只有三个非常重要。按严重程度排列,它们分别是revert, unrecord, obliterate. 你也可以将它们视为对称表的一部分
近期 | 任务 | 反任务 |
---|---|---|
最新 | whatsnew (例如:添加、删除、移动、编辑文件) |
revert |
近期 | record | unrecord |
较早 | pull | unpull (又称 obliterate) |
别太担心这张表。它迟早会变得有意义的。
无论如何,以下是对所有不同删除内容方法的简要比较。每个方法都有其用武之地,即使是那些奇怪的方法,比如rollback.
这些命令中最简单的是 **revert**。revert 的作用就是删除你还没有记录的内容。你可以将 revert 视为 whatsnew 的“反面”。revert 删除的是新内容。
**Unrecord** 与 revert 的作用完全不同。revert 删除的是新内容,而 unrecord 删除的是补丁,但重要的是,它会 *使补丁中的内容再次变为新内容*,以便你可以随意选择重新记录或撤销它。
只有当你记录了一些内容,然后意识到自己犯了错误,想要以不同的方式记录时才应该使用 unrecord(另请注意 amend-record)。注意:只有当你确定你的仓库是唯一包含该补丁的仓库时才应该使用 unrecord!
请注意,上面的图片更准确地描述了 unrecord 的作用——它从原始树中删除了一个补丁及其相应的修改。内容再次变为新内容只是这个事实的自然结果。
**Obliterate** 故意被命名为一个令人害怕的词。Obliterate 可以看作是 unrecord 一个补丁(从而使它的内容再次变为新内容),然后 revert 它。换句话说,obliterate 会完全删除一个补丁!通常情况下:你会使用 obliterate 回到很早之前的时间点。比如,“嗯,我过去三个月一直在做的那些东西都很愚蠢”。Obliterate 就是你的答案。
最好darcs get你仓库的备份副本,然后再 obliterate 内容。这样,如果你不小心删除了内容,就可以把它拉回来。 |
**Unpull** 和 **obliterate** 是完全相同的命令,只是为了反映它在撤销 pull 操作中的用途而被命名为 unpull。
**Rollback** 不是你经常会用到的命令。情况是这样的。你想要删除一个补丁,但人们一直在告诉你,你不应该 obliterate 或 unrecord 已经在其他人仓库中的补丁。那么你该怎么办呢?一个解决方案是打开你的文本编辑器,做出与补丁中修改完全相反的修改(然后记录等等)。另一个解决方案是生成一个 rollback 补丁,它能做同样的事情。它会创建一个补丁,与另一个补丁的作用完全相反。
一些用户发现直接使用文本编辑器更容易。
尽管它的名称是“删除内容”风格,remove实际上并不是一个撤销类命令。它的作用与add相反:它告诉 darcs 不再关注某个文件。但正如我们在上一章中提到的,大多数时候你甚至不需要darcs remove. 只需要告诉你的计算机删除工作目录中的文件就足够了,darcs 会注意到它不见了。
- 但是...但是...我只想回到两周前我的仓库的状态!
- obliterate这可能是你想要做的。见上文。