Version control 化石供应链-恢复到特定版本,如Mercurial

Version control 化石供应链-恢复到特定版本,如Mercurial,version-control,fossil,Version Control,Fossil,使用Mercurial时,如果我想用特定版本更改当前工作副本,我只需执行以下操作: $> hg revert good_revision $> hg commit -m "Now I'm in the good revision" 然后我可以看到我的所有文件都处于良好的修订状态,并且可以开始处理它 到目前为止,我可以对化石进行恢复,但只能对特定的文件进行恢复,而不是对整个存储库进行恢复,而且更新或签出似乎不像我预期的那样有效 fossil如何将我的整个存储库恢复到某个版本?我不确定

使用Mercurial时,如果我想用特定版本更改当前工作副本,我只需执行以下操作:

$> hg revert good_revision
$> hg commit -m "Now I'm in the good revision"
然后我可以看到我的所有文件都处于良好的修订状态,并且可以开始处理它

到目前为止,我可以对化石进行恢复,但只能对特定的文件进行恢复,而不是对整个存储库进行恢复,而且更新或签出似乎不像我预期的那样有效


fossil如何将我的整个存储库恢复到某个版本?

我不确定我是否完全遵循,但我认为您想要的是能够在fossil中创建“一个分支上有多个头部”的评估。如果是的话,那么化石确实支持这一点,只是它把树枝的头叫做“叶子”,这个过程叫做“分叉”

要做到这一点,你必须

fossil update good_revision
然后

fossil commit --allow-fork
现在,您可以生成
化石ui
,导航到您的分支并看到它有两片叶子

现在可以关闭当前叶

请注意,尽管受到支持,但这似乎不是推荐的做法。相反,Fossil建议采用一种相当奇特的方法来抛弃变化:

  • 将“坏”叶处的分支重命名为“错误”(如果该分支尚不存在,则创建该分支)。通过这样做,您可以有效地将产生的次级抵押“标记”为错误

    请注意,“错误”名称只是一个约定;新创建的存储库中不存在此分支

  • 关闭“坏”叶子

  • 使用
    化石更新
    返回上一个良好状态,继续黑客攻击

    由于“last good”提交仍然继承其父提交的分支标记,因此您记录的下一次提交也将继承它,并且不会出现在分支“Mirror”上


  • 例如,-在这个分支上有一堆不同的提交短链。另请参见。

    对于我认为我理解的问题,我的解决方案稍有不同(意译:如何处理比当前分支/主干叶更老的“好的修订版”,我将其称为坏的叶,并将“好的修订版”后的更改视为坏的),这相当于在两个版本之间应用差异,但顺序相反:

    合并到good_修订版的(空)fork中,使用bad_叶的基线,而不是默认的最后一次公共提交;因此,将应用的差异是原始分支的差异返回到您创建的良好修订分支,因为它不会看到它们已经被应用。使用最新的作为基线“隐藏”那些本来会使其忽略所有更改的更改,因为它们已经应用

    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的反向差异应用到bad_leaf,将您放回到原来的位置,并且您可以继续提交到以前在bad_leaf的相同(新)leaf

    与上述命令匹配后的签出相比,在原始good_修订版签出时的
    diff
    (直接gnu,而不是化石diff)。除了丢失文件的空目录外,fossil不会跟踪/整理死目录

    警告:我使用化石的时间还不长,它与我在cvs/svn/git/hg/perforce/clearcase中使用的常用方法有很多不同之处


    添加此答案的原因:我发现现有答案更难理解,因此不确定我是否相信自己能正确回答。

    如果我正确理解您的问题,在开发周期中的某个地方出现了一个问题,现在您希望将一个或多个修订返回到一个已知的良好修订版,并开始使用它。此外,您希望该修订版成为您的主干。化石中的方法与Mercurial相似:

    fossil revert -r good_revision
    fossil commit -m "Now I'm in the good revision"
    
    这将用指定版本中的文件替换工作目录中的文件。commit将把它们提交到您正在处理的任何分支(我假设在本例中它是主干)。如果未指定修订号,它将使用上次提交的版本

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

    fossil revert  -r good_revision  my_file
        (or)
    fossil revert  my_file_from_the_last_commit
    
    但是,如第一个示例所示,省略文件名会导致恢复所有文件。有关更多信息,请参见


    很抱歉最近的回复,但我只是在寻找其他问题时遇到了这个问题。我发布这篇文章,以防其他人正在研究如何恢复到存储在化石中的以前提交的版本。

    几乎在那里,缺少的是我希望新叶(使用--allow fork创建的叶)成为我的新主干。@TimoteoPonce,呃,我想你可能误解了化石的分支模型。它支持每根树枝上的几片叶子,所以你不能有叶子,因为树干上的所有叶子都叫做“躯干”。“TiMyTeopOne”,另一方面,如果你在树枝上只有一个开阔的叶子(和任何闭合的,包括没有的),你可能会认为叶子是树枝。但我无论如何也不会欺骗自己。因此,我的回答确实涉及到这个问题。事实上,我只是应用了它,并且它按照预期工作,谢谢您,先生。顺便说一句,
    hg revert
    对于您的任务“更新到特定版本”是错误的解决方案。我没有提到“更新到特定版本”,我提到它是“更改到特定版本”,也许我弄错了“change”这个词,使用“revert”可能会更好。如果您只想还原一个版本,可以使用fossil merge--backout注意:如果您要还原的编辑只是意外地从另一个应该进行此编辑的分支放在这个分支上,如果要将更改合并回另一个分支中,您需要小心一些,这样它就不会在那里恢复更改。