2011-09-13 41 views
0

我有一个来自另一个存储库中的“默认”分支。
我有我的工作在分支“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?

任何反馈欢迎!

+1

请注意,你不推 “修订版”,即。不是代码的快照,而是推送更改集,其中包含对代码的更改。因此,只推送* only * changeset 8,如果可能的话,不会推送您在更改集5和6中所做的更改。 –

回答

0

从我理解你的问题,感觉就像你想拥有远程仓库的相同的状态是本地仓库。你也不需要额外的分支,你需要一个线性历史记录和一个单独的提交。

让我们看看两两件事第一,mergerebase

最初,你克隆稳定,你承诺你自己的变更,其是xy,你拉从远程仓库这是abc变更。现在你的历史看起来像这样。

stable -> a -> b -> c 
     \ 
     \-> x -> y 

合并

你想拥有你的仓库在这样的状态比你想有一个头。你选择合并。你做了hg up -r bhg merge -r y,解决了合并冲突(如果它在那里的话)。现在你的历史看起来像这样。

stable -> a -> b -> c -> d 
     \   /
     \-> x -> y -/ 

现在你有一个新的提交d,这是一个合并提交。更新至d后,您的回购的当前状态包含来自两个分行的更改。

再次基于

是衍合Mercurial中的extenison,你可以很容易地通过添加一行到您的.hgrc使用。让我们看看当你在初始状态下做hg rebase -s x -d c会发生什么。你的历史看起来如下。

stable -> a -> b -> c -> x -> y 

在这种情况下,你有一个线性的历史,你都变更xy是那里的稳定分支。

结论

一个强有力的理由,为什么人们倾向于使用rebasemerge的,使他们能够保持线性的历史,这帮助了很多与其他信息库共享的变化。

对于您的情况,如果合并提交没有子项,则可以通过hg rollbackhg strip撤消合并提交。在孩子的情况下,你必须rebase他们y,然后strip合并提交,然后rebase整个链从xc

从上面的rebase部分中的DAG中,您可以轻松推送xy。如果你想要一次提交,你可以使用histedit扩展或fold命令,它是evolve的一部分,它们都可以合并/合并/加入/压缩/折叠这两个提交到一个提交中,并且结果历史将会是这样的。

stable -> a -> b -> c -> z 

z包含来自xy变更的变化。

相关链接