我可以为 BitBucket (Mercurial) 中的旧提交创建新分支吗?

Can I create a new branch for an old commit in BitBucket (Mercurial)?

我已经尝试找到我想要分支的提交,但我看不到任何创建分支的选项。

我也试过创建一个分支,但我看不到任何方法来 select 一个旧的提交。

此问题与my question about pushing a new branch

相关

TL;DR

使用hg update -r <rev>签出您想要成为新分支父级的修订。然后,在下一个 hg commit 之前的任何时间,使用 hg branch <new-branch-name> 记录要创建的分支的 name。进行您想要的任何更改,然后 运行 hg commit 创建一个创建分支的新提交。新提交将是新分支中的唯一提交,并且将是该分支的头部(单数)。

更长的描述

(注意:由于我不使用花哨的 GUI,因此我只能回答有关命令行选项的问题。)

在 Mercurial 中,您通过以下方式创建分支:

  1. 使用 hg branch 分支名称:

    hg branch newbranch
    

    Mercurial 将回复:

    marked working directory as branch newbranch
    (branches are permanent and global, did you want a bookmark?)
    

    (如果已经有default以外的分行则省略第二句)

  2. 进行新提交。

在您执行第 2 步之前,您 "made" 和 hg branch 的分支不存在:它只是一个分支的 idea。这个想法与工作树的状态一起保存。

请注意,无论何时创建新提交,新提交都有一个父提交(或者偶尔有两个父提交,当结束合并时)。新提交的父 ID 是当前提交的 ID,即修订 .。这就是您必须首先更新到所需版本的原因。

工作树实际上是提议的提交。但是,在您使它不同于 current 提交之前,没有要提交的更改集。 (如果您熟悉 Git,这与其内部结构类似,但存在一些关键差异。在 Git 中,当前修订名为 HEAD 而不是 . , 而不是工作树作为提议的提交, Git 使用它的 "index" 作为提议的提交. 更关键的是, 在 Git 中, 一个提交同时在一些不同的分支上, 所以除了两种特殊情况, Git 立即创建分支名称, 而不是在有提交后才创建分支名称。这是因为新分支和旧分支共享所有旧分支的提交——一种特殊的疯狂, 虽然最后一切都解决了。)

这显示在 hg summary 的输出中,它描述了:

  • 如果您现在提交,您的新变更集将拥有的父代 ID,即修订的修订 ID .
  • 当前分支的名称(分支本身可能还不存在);
  • 与修订 .;
  • 相比的工作树状态
  • 距离.当前分支的当前头(包含.的分支);
  • 草案和秘密阶段提交的数量,如果有的话;
  • 以及一些可选的附加信息。

Mercurial 中的 head 是同一分支中没有后代提交的任何提交。更新到一个本身不是头的旧版本,然后创建一个新的提交,将自动创建一个新的头,将头的数量增加一个。如果该新头在现有分支中,则现有分支的头数同样增加一个。如果那个新的 head 导致创建了一个新的分支,那么新的分支现在就会出现并有一个提交,这是一个 head 提交。

要创建一个新的命名分支,这就是你想要的。因此,您需要更新到起始修订版(如果您愿意,这可以是现有的分支头),然后切换到实际上尚不存在的新分支。然后您可以提交以创建分支,其单一修订版是新分支的头部。 (如果之前的提交是旧分支的一个或那个头,它仍然是一个头。)