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 B
和 C
(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
。
通常,在 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 B
和 C
(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
。