Mercurial - 旧代码的Rebase分支在新代码提示之上,忽略分支与旧代码的合并

时间:2011-05-10 16:12:18

标签: mercurial rebase transplant

我正在玩Adium source code并发现他们在adium-1.4中有一个未发布的分支,它通过使用名为facebook-xmpp的XMPP修复了Facebook聊天集成。一切都很好,遵守它并且有效。

问题是,如果我想在最新的Adium 1.5中拥有相同的功能,其代码在大约两年前从旧版本拆分(旧版本的某些更改集会不时移植),我想想我必须以某种方式重新组合构成facebook-xmpp分支的整个变更集范围,并将其应用到较新的adium-1.5分支的顶端。我认为这可能有用,因为facebook-xmpp看起来主要是添加新代码,所以它应该很容易与最新的开发代码集成。

但是,由于facebook-xmpp分支多次与adium-1.4合并,我发现重新定位会将合并后的更改从adium-1.4提升到adium-1.5,这样就可以了很多合并冲突。

---------------------------------------  adium-1.4
               |                   \---  facebook-xmpp (created 1 month ago)
               |
               \-----------------------  adium-1.5
               ^ sometime in 2009

问题是,有没有办法移植到adium-1.5仅添加到facebook-xmpp分支的变更集,不包括与adium-1.4合并的变更集?

1 个答案:

答案 0 :(得分:3)

方法1(手动补丁)

如果您只想在facebook-xmpp中使用audium-1.5功能,则可以

  1. audium-1.4的提示合并到facebook-xmpp,然后
  2. audium-1.4facebook-xmpp以及
  3. 的提示之间创建差异
  4. 尝试将该补丁应用到adium-1.5的顶端。
  5. 这应该有效,但新补丁与原始开发历史记录断开连接。

    --------o---o    <- tip of audium-1.4
       \     \   \
        \     o---o  <- tip of facebook-xmpp (all audium-1.4 changes merged in)
         \
          o-------o  <- tip of audium-1.5 (apply patch here)
    

    基本上这些命令应该这样做:

    $ hg up facebook-xmpp
    $ hg merge audium-1.4
    $ hg commit -m "Merge audium-1.4 into facebook-xmpp"
    $ hg diff -r audium-1.4 -r facebook-xmpp > fbx.patch # facebook-only changes
    $ hg up audium-1.5
    $ hg import fbx.patch # good luck
    

    方法2(选择性合并)

    另一个显示历史图表更多方面的解决方案是,在使用merge tool configuration作为默认合并的{{3}}时,将facebook-xmpp直接合并到audium-1.5工具(阻止您的合并工具弹出1000次),但会定期合并任何internal:local相关文件(如果您知道哪些文件与其功能相关)。然后,在提交合并之前,还原所有与facebook事物无关的文件。

    更新:以下是此第二种解决方案的一些示例说明。假设facebook-xmpp分支创建了一些名为facebook-xmpp的新文件并更改了现有文件fb-<something>.cfoo.c(您从bar.c之间的差异中获取这些文件最新合并facebook-xmpp)。将audium-1.4合并到facebook-xmpp时,请使用以下合并工具配置:

    audium-1.5

    第一个合并配置可确保对$ hg up audium-1.5 $ hg --config ui.merge=internal:local \ --config merge-patterns.fb-*.c=internal:merge \ --config merge-patterns.foo.c=internal:merge \ --config merge-patterns.bar.c=internal:merge \ merge facebook-xmpp audium-1.5中更改的文件保留一般audium-1.4次更改。其他配置选项确保对audium-1.5分支触及的任何文件执行常规合并,可能需要手动解决冲突。例如,如果facebook-xmpp引发冲突,请运行

    foo.c

    解决与您最喜欢的手动合并工具的冲突。最后,您必须提交合并,而不提交源自$ hg resolve foo.c 的任何新文件。只需提交audium-1.4内容:

    facebook-xmpp