Fossil SCM - 如何像Mercurial一样回退到特定版本?

4
使用Mercurial时,如果我想将当前的工作副本更改为特定版本,则只需执行以下操作:
$> hg revert good_revision
$> hg commit -m "Now I'm in the good revision"

我可以看到所有我的文件都处于good_revision状态,可以开始工作了。

到目前为止,在fossil中我只能还原特定的文件,而不是整个仓库,更新或检出似乎不像我期望的那样工作。

fossil如何将整个仓库还原到某个特定版本?


顺便提一下,“hg revert”不是你的任务“更新到特定版本”的正确解决方案。 - Lazy Badger
我没有提到“更新到特定版本”,我是说“更改到特定版本”,也许我误用了“更改”这个词,最好使用“还原”。 - Timoteo Ponce
如果您只想还原单个修订版本,则可以使用fossil merge --backout <revision>。 - Breezer
3个回答

7

我不太确定我是否完全理解了,但我认为您想要在Fossil中创建“一个分支上的多个头”的情况。如果是的话,那么Fossil支持这一点,只是它将分支的头称为“叶子”,此过程称为“分叉”。

要实现这一点,您需要:

fossil update good_revision

然后

fossil commit --allow-fork

现在您可以启动 fossil ui,导航到您的分支并查看它拥有两个叶子。
现在,您可以关闭该“当前”叶子。
请注意,虽然支持此操作,但这似乎并不是一个推荐的方法。相反,Fossil 推荐一种非常独特的方法来丢弃更改:
1. 将“错误”的叶子处的分支重命名为“mistake”(或者如果该分支尚不存在,则创建该分支)。通过这样做,您实际上将结果子叶标记为错误。
请注意,“mistake”名称只是一个约定;在全新创建的存储库中,不存在该分支。
2. 关闭“错误”的叶子。
3. 使用 fossil update 返回到上一个良好状态,继续修改。
由于“last-good”提交仍继承其父提交的分支标签,因此您记录的下一个提交也将继承它,并且不会位于“mistake”分支上。
有关示例,请参见 SQLite 存储库中的各种短��交链。请参见此文

快成功了,缺少的是我希望那个新分支(使用--allow-fork创建的)成为我的新主干。 - Timoteo Ponce
@TimoteoPonce,恩,我认为你可能误解了Fossil的分支模型。它支持每个分支多个叶子,所以你不能有一个叶子是“主干”,因为在名为“trunk”的分支上所有叶子都具有相同的“rank”。 - kostix
另一方面,如果您在分支上只有一个打开的叶子(包括零个或多个关闭的叶子),您可能会认为该叶子是分支。但无论如何,我不会欺骗自己。因此,我的答案确实涉及此问题。 - kostix
确实如此,我刚刚应用了它,按预期工作了,谢谢您先生。 - Timoteo Ponce

2

我对我理解的问题提出了略微不同的解决方案(简化版:如何在旧版本“good_revision”上工作,而不是当前分支/主干的叶子版本“bad_leaf”,并将自“good_revision”以来的更改视为错误),这在某种程度上相当于反向应用两个版本之间的差异:

从good_revision合并一个(空)分支,使用bad_leaf的基线而不是默认的最后公共提交;因此,将应用的差异是原始分支与您创建的good_revision分支之间的差异,它不会看到它们已经被应用。使用最新的基线“隐藏”了那些本来会使它忽略所有更改的差异,因为它们已经被应用。

fossil update good_revision
fossil commit --allow-fork --allow-empty
# note the uuid from that commit (for use as forked_basis below)
fossil merge -f --integrate --baseline bad_leaf forked_basis

当然,一旦满意,
fossil commit

它不会创建任何应该被称为“错误”的分支,它只是将good_revision到bad_leaf的反向diff应用于bad_leaf,使您回到原来的状态,并且您可以继续在相同(新的)叶子上提交,该叶子曾经在bad_leaf处。
与原始good_revision检出的检出相比,使用上述命令的检出进行了diff(直接gnu,而不是fossil diff)匹配。除了失去其文件的空目录外,但fossil不会跟踪/整理死目录。
注意:我使用fossil并不久,并且它在几个方面与我一直使用的cvs/svn/git/hg/perforce/clearcase有所不同。
添加此答案的原因:我发现现有的答案更难理解,并且由于此原因,我不确定自己是否正确执行了它们。

注意:如果你要撤销的编辑只是意外地从另一个应该有这个编辑的分支放到了这个分支上,那么在将更改合并回另一个分支时需要小心,以避免在那里还原更改。 - Breezer

2

如果我正确理解您的问题,那么在开发过程中某处出现了问题,您现在想返回到一个或多个已知的好版本,并开始使用它。此外,您希望该版本成为您的主干。 Fossil的方法类似于Mercurial:

fossil revert -r good_revision
fossil commit -m "Now I'm in the good revision"

这将使用指定版本的文件替换工作目录中的文件。 提交会将它们提交到您正在使用的任何分支(在此示例中,我假设它是主干)。如果您没有指定版本号,则会使用最后提交的版本。

还原命令的更常见用法之一是回滚单个文件:

fossil revert  -r good_revision  my_file
    (or)
fossil revert  my_file_from_the_last_commit

然而,正如第一个示例所示,省略文件名会导致所有文件都被还原。更多信息请参见https://www.fossil-scm.org/index.html/help?cmd=revert
抱歉回复晚了,我在寻找其他东西时偶然发现了这个问题。如果有人想知道如何恢复到以前在Fossil中提交的版本,请查看此内容。

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