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

时间:2016-02-10 22:23:43

标签: mercurial rebase

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

hg pull --rebase

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

hg pull
hg rebase <probably with some options?>

2 个答案:

答案 0 :(得分:6)

hg pull --rebase做的事情确实是首先使用默认参数hg pull然后hg rebase(您可以查看rebase.py中的代码功能pullrebase())中的Mercurial分布,但仅在中提取任何新修订时。如果不需要变基,hg pull --rebase将更新为新的分支提示。因此,hg pull && hg rebase大致正确,但并未完全捕捉到一些极端情况(没有新版本,也没有必要的修改)。

默认情况下,hg rebase将使用工作目录的父级作为rebase的基本修订版和当前分支的最新版本(通常是您刚刚提取的内容) )作为目的地。简而言之,它相当于hg rebase -b . -d 'last(branch(.))'

“基础修订”在这种情况下意味着什么?这意味着Mercurial将去寻找基本修订版和目的地中最不常见的祖先。然后它会将所有内容重新定义,但不包括目的地上最不常见的祖先。即,指定基本修订允许您在分支[1]上选择要修改的几乎任何修订,并让Mercurial确定哪些修订属于该分支。

请注意,因为rebase基于当前工作目录的父级,这意味着如果您当前的结帐您正在处理的内容,那么hg pull --rebase可能会感到惊讶你实际上试图改变一个不同的分支(它通常会失败,因为这些修订通常是公共阶段的一部分,但如果你正在使用所谓的non-publishing repositories <你需要注意的事情em>和不使用命名分支。)

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

答案 1 :(得分:1)

如果你想手工变装(坏主意),你必须

  • 之前阅读hg help rebase
  • 了解可用于rebase的选项(至少-s-d
  • 使用这些选项

让我们看看玩具回购:

回购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

即。重新拉动的结果是&#34;线性历史与远程变化之上的局部变化&#34;相比之下只是拉从C

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中

B-repo C-repo

并且为了从C获得B,你必须将2(-s 2)重新绑定到新的父5(-d 5),但是短hg rebase -b 2也可以使用同样的效果

相关问题