Mercurial:在没有祖先的情况下推动变更集
我有一个来自另一个存储库的“默认”分支。Mercurial:在没有祖先的情况下推动变更集,mercurial,Mercurial,我有一个来自另一个存储库的“默认”分支。 我在“我的任务”分部工作 当我完成工作后,我从远程存储库中取出修订版7。我将本地变更集6与7合并,并承诺使用8 Rev Branch * 8 Default |\ * \ 7 Default | | | * 6 Mytask | | | * 5 Mytask | | * | 4 De
我在“我的任务”分部工作 当我完成工作后,我从远程存储库中取出修订版7。我将本地变更集6与7合并,并承诺使用8
Rev Branch
* 8 Default
|\
* \ 7 Default
| |
| * 6 Mytask
| |
| * 5 Mytask
| |
* | 4 Default
| |
* / 3 Default
|/
* 2 Default
|
* 1 Default
有人知道是否可以只将修订版8推送到远程存储库,而不同时推送带有变更集5和6的Mytask分支
欢迎任何反馈 看看这个问题的答案 . 挤压是本例中的关键词
有一个类似于您想要做的事情以及关于该问题的其他链接。根据我对您的问题的理解,感觉您希望远程存储库的状态与本地存储库的状态相同。另外,您不需要额外的分支,您需要一个线性历史记录和一个提交 让我们先看两件事,
merge
和rebase
最初,您克隆了stable,您提交了自己的变更集,它们是x
和y
,您从远程存储库中提取了变更集,它们是a
、b
和c
。现在你的历史是这样的
stable -> a -> b -> c
\
\-> x -> y
stable -> a -> b -> c -> d
\ /
\-> x -> y -/
stable -> a -> b -> c -> z
合并
您希望存储库处于这样的状态,而不是希望只有一个头。你选择了合并。您执行了hg up-rb
和hg merge-ry
,解决了存在的合并冲突。现在你的历史是这样的
stable -> a -> b -> c
\
\-> x -> y
stable -> a -> b -> c -> d
\ /
\-> x -> y -/
stable -> a -> b -> c -> z
现在您有了一个新的提交d
,它是一个合并提交。更新到d
后回购的当前状态包含来自两个父分支机构的更改
重新设置基础
Rebase是Mercurial中的一个扩展,您可以通过在.hgrc中添加一行来轻松使用它。让我们看看在初始状态下执行hg rebase-s x-d c时会发生什么。你的历史如下
stable -> a -> b -> c -> x -> y
在这种情况下,您有一个线性历史,并且您的变更集x
和y
都在稳定分支上
结论
人们倾向于使用merge
的rebase
,以便维护线性历史,这有助于与其他存储库共享更改
在您的情况下,如果合并提交没有子项,您可以通过hg rollback
或hg strip
撤消合并提交。对于儿童,您必须在y
上重新设置其基础,然后剥离合并提交,然后重新设置从x
到c
的整个链的基础
从rebase部分(上面)中的DAG,您可以轻松地按下x
和y
。如果您想要单次提交,可以使用histedit
扩展或fold
命令,这是evolve
的一部分,这两个命令都可以将这两次提交折叠/合并/合并/挤压/折叠为一次提交,生成的历史记录如下所示
stable -> a -> b -> c
\
\-> x -> y
stable -> a -> b -> c -> d
\ /
\-> x -> y -/
stable -> a -> b -> c -> z
其中z
包含来自x
和y
变更集的变更
相关链接
请注意,您没有推送“修订版”,即不是代码的快照,而是推送包含代码更改的变更集。因此,如果可能的话,只推送变更集8不会推送您在变更集5和6中所做的更改。