我可以为 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 中,您通过以下方式创建分支:
使用 hg branch
分支名称:
hg branch newbranch
Mercurial 将回复:
marked working directory as branch newbranch
(branches are permanent and global, did you want a bookmark?)
(如果已经有default
以外的分行则省略第二句)
进行新提交。
在您执行第 2 步之前,您 "made" 和 hg branch
的分支不存在:它只是一个分支的 idea。这个想法与工作树的状态一起保存。
请注意,无论何时创建新提交,新提交都有一个父提交(或者偶尔有两个父提交,当结束合并时)。新提交的父 ID 是当前提交的 ID,即修订 .
。这就是您必须首先更新到所需版本的原因。
工作树实际上是提议的提交。但是,在您使它不同于 current 提交之前,没有要提交的更改集。 (如果您熟悉 Git,这与其内部结构类似,但存在一些关键差异。在 Git 中,当前修订名为 HEAD
而不是 .
, 而不是工作树作为提议的提交, Git 使用它的 "index" 作为提议的提交. 更关键的是, 在 Git 中, 一个提交同时在一些不同的分支上, 所以除了两种特殊情况, Git 立即创建分支名称, 而不是在有提交后才创建分支名称。这是因为新分支和旧分支共享所有旧分支的提交——一种特殊的疯狂, 虽然最后一切都解决了。)
这显示在 hg summary
的输出中,它描述了:
- 如果您现在提交,您的新变更集将拥有的父代 ID,即修订的修订 ID
.
;
- 当前分支的名称(分支本身可能还不存在);
- 与修订
.
; 相比的工作树状态
- 距离
.
当前分支的当前头(包含.
的分支);
- 草案和秘密阶段提交的数量,如果有的话;
- 以及一些可选的附加信息。
Mercurial 中的 head 是同一分支中没有后代提交的任何提交。更新到一个本身不是头的旧版本,然后创建一个新的提交,将自动创建一个新的头,将头的数量增加一个。如果该新头在现有分支中,则现有分支的头数同样增加一个。如果那个新的 head 导致创建了一个新的分支,那么新的分支现在就会出现并有一个提交,这是一个 head 提交。
要创建一个新的命名分支,这就是你想要的。因此,您需要更新到起始修订版(如果您愿意,这可以是现有的分支头),然后切换到实际上尚不存在的新分支。然后您可以提交以创建分支,其单一修订版是新分支的头部。 (如果之前的提交是旧分支的一个或那个头,它仍然是一个头。)
我已经尝试找到我想要分支的提交,但我看不到任何创建分支的选项。
我也试过创建一个分支,但我看不到任何方法来 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 中,您通过以下方式创建分支:
使用
hg branch
分支名称:hg branch newbranch
Mercurial 将回复:
marked working directory as branch newbranch (branches are permanent and global, did you want a bookmark?)
(如果已经有
default
以外的分行则省略第二句)进行新提交。
在您执行第 2 步之前,您 "made" 和 hg branch
的分支不存在:它只是一个分支的 idea。这个想法与工作树的状态一起保存。
请注意,无论何时创建新提交,新提交都有一个父提交(或者偶尔有两个父提交,当结束合并时)。新提交的父 ID 是当前提交的 ID,即修订 .
。这就是您必须首先更新到所需版本的原因。
工作树实际上是提议的提交。但是,在您使它不同于 current 提交之前,没有要提交的更改集。 (如果您熟悉 Git,这与其内部结构类似,但存在一些关键差异。在 Git 中,当前修订名为 HEAD
而不是 .
, 而不是工作树作为提议的提交, Git 使用它的 "index" 作为提议的提交. 更关键的是, 在 Git 中, 一个提交同时在一些不同的分支上, 所以除了两种特殊情况, Git 立即创建分支名称, 而不是在有提交后才创建分支名称。这是因为新分支和旧分支共享所有旧分支的提交——一种特殊的疯狂, 虽然最后一切都解决了。)
这显示在 hg summary
的输出中,它描述了:
- 如果您现在提交,您的新变更集将拥有的父代 ID,即修订的修订 ID
.
; - 当前分支的名称(分支本身可能还不存在);
- 与修订
.
; 相比的工作树状态
- 距离
.
当前分支的当前头(包含.
的分支); - 草案和秘密阶段提交的数量,如果有的话;
- 以及一些可选的附加信息。
Mercurial 中的 head 是同一分支中没有后代提交的任何提交。更新到一个本身不是头的旧版本,然后创建一个新的提交,将自动创建一个新的头,将头的数量增加一个。如果该新头在现有分支中,则现有分支的头数同样增加一个。如果那个新的 head 导致创建了一个新的分支,那么新的分支现在就会出现并有一个提交,这是一个 head 提交。
要创建一个新的命名分支,这就是你想要的。因此,您需要更新到起始修订版(如果您愿意,这可以是现有的分支头),然后切换到实际上尚不存在的新分支。然后您可以提交以创建分支,其单一修订版是新分支的头部。 (如果之前的提交是旧分支的一个或那个头,它仍然是一个头。)