hg pull --rebase 中使用的 rebase 命令是什么

What is the rebase command used in hg pull --rebase

通常,在 HG 中,我的工作流程专门使用:

hg pull --rebase

如果我想在两个命令中 运行 这个,我该怎么做?

hg pull
hg rebase <probably with some options?>

如果你想手动变基(坏主意),你必须

  • 阅读hg help rebase之前
  • 了解对您有用的变基选项(至少 -s-d
  • 使用这些选项

让我们在 toy-repos 看看:

回购 A

A>hg log -T "{rev} {desc}\n"
1 A2
0 A1

有 2 个变更集 A1 和 A2 被克隆到 repos BC(B 代表 pull --rebase A,C 代表干净 pull A

并且在克隆后向 A 和 B+C 添加了两个额外的变更集以测试您的用例(不同的历史记录)

A>hg log -T "{rev} {desc}\n"
3 A2++
2 A2+
1 A2
0 A1

B>hg log -T "{rev} {desc}\n"
3 B2
2 B1
1 A2
0 A1

C 状态与 B 相同

B>hg pull --rebase 
...
B>hg log -T "{rev} {desc}\n" -G
@  5 B2
|
o  4 B1
|
o  3 A2++
|
o  2 A2+
|
o  1 A2
|
o  0 A1

即与仅从 C

中拉取相比,rebased pull 的结果是 "linear history with local changes on top of remote changes"
C>hg log -T "{rev} {desc}\n" -G
@  5 A2++
|
o  4 A2+
|
| o  3 B2
| |
| o  2 B1
|/
o  1 A2
|
o  0 A1

或者,在 GUI 中

并且为了从 C 中获取 B,您必须将 2 (-s 2) 变基为新的父 5 (-d 5),但是短 hg rebase -b 2 也可以工作效果一样

hg pull --rebase 所做的确实是先做一个 hg pull,然后 hg rebase 并在其上添加默认参数(您可以查看 rebase.py 中的代码在函数 pullrebase() 中的 Mercurial 分布中),但 仅当引入任何新修订时 。如果不需要变基,hg pull --rebase 将改为更新到新的分支提示。因此,hg pull && hg rebase 大致正确,但没有完全捕捉到一些极端情况(没有新的修订,不需要变基)。

默认情况下,hg rebase 将使用工作目录的父目录作为 rebase 的 base 修订 和当前分支的最新修订(即通常你刚刚拉进来的)作为目的地。简而言之,它相当于 hg rebase -b . -d 'last(branch(.))'.

在这种情况下,"base revision" 是什么意思?这意味着 Mercurial 将去寻找基本修订版和目标的最不常见的祖先。然后它将重新定位所有内容,但不包括目的地顶部的那个最不常见的祖先。即,指定基本修订版允许您在分支 [1] 上选择几乎所有要变基的修订版,并让 Mercurial 确定哪些修订版属于该分支。

请注意,因为 rebase 是基于当前工作目录的父目录,这意味着如果您当前的签出 不是 您一直在处理的内容,那么 hg pull --rebase 可能会让你大吃一惊,因为实际上尝试重新设置一个不同的分支(它通常会失败,因为这些修订通常是 public 阶段的一部分,但如果你正在使用它,你需要注意这一点所谓的 non-publishing repositories 不要使用命名分支。

[1] 此上下文中的分支是指匿名或拓扑分支,而不是命名分支。有关详细信息,请参阅 hg help glossary