Mercurial:在没有祖先的情况下推动变革集

时间:2011-09-13 16:12:27

标签: mercurial

我有一个来自另一个存储库的“默认”分支。
我的工作在“Mytask”分支。

当我完成工作后,我从远程存储库中提取修订版本7.我从本地更改集6中合并了7并且已提交到8。

           Rev  Branch

    *      8    Default
    |\ 
    * \    7    Default
    |  |
    |  *   6    Mytask
    |  | 
    |  *   5    Mytask
    |  |
    *  |   4    Default
    |  |
    * /    3    Default
    |/
    *      2    Default
    |
    *      1    Default

有没有人知道是否可以仅将版本8推送到远程存储库而不用我的Mytask分支推送变更集5和6?

欢迎任何反馈!

2 个答案:

答案 0 :(得分:1)

看看这个问题的答案 about squashing commits。挤压是这种情况下的关键词。

有一个collapse extension看起来像你想要做的以及该问题上的其他链接。

答案 1 :(得分:0)

从我的问题所理解的情况来看,您感觉想要拥有与本地存储库相同的远程存储库状态。此外,您不需要额外的分支,您需要线性历史记录以及单个提交。

让我们先看看两件事,mergerebase

最初您克隆了稳定版,您提交了自己的xy更改集,您从远程存储库中提取了ab和{{}的更改集1}}。现在你的历史看起来像这样。

c

<强>合并

您希望您的存储库处于一种状态,而不是您希望拥有单个头。你选择了合并。您执行了stable -> a -> b -> c \ \-> x -> y hg up -r b,解决了合并冲突(如果有)。现在你的历史就像这样。

hg merge -r y

现在你有了一个新的提交 stable -> a -> b -> c -> d \ / \-> x -> y -/ ,这是一个合并提交。更新到d后,您的仓库的当前状态包含来自两个父分支的更改。

<强>衍合

Rebase是Mercurial中的一种延伸,您可以通过在.hgrc中添加一行来轻松使用。让我们看看当你对我们的初始状态d做什么时会发生什么。您的历史记录如下。

hg rebase -s x -d c

在这种情况下,您有一个线性历史记录,并且您的更改集stable -> a -> b -> c -> x -> y x都位于稳定分支上。

<强>结论

人们倾向于使用y的{​​{1}}以便他们可以维护线性历史记录,这有助于与其他存储库共享更改。

在您的情况下,如果合并提交没有子项,则可以通过rebasemerge撤消合并提交。如果是儿童,则必须在hg rollbackhg strip,然后rebase合并提交,然后ystriprebase的整个链}}

从rebase部分(上图)中的DAG,您可以轻松推送xc。如果您想要单个提交,则可以使用x扩展名或y命令,该命令是histedit的一部分,这两个命令都可以折叠/合并/加入/压缩/折叠这两个提交进入一个提交,你的结果历史将是这样的。

fold

evolve包含stable -> a -> b -> c -> z z更改集的更改。

相关链接