Git:合并两个不同的独立回购

时间:2011-03-18 12:39:30

标签: svn git git-rebase git-merge

存储库A:从修订版r的项目SVN迁移到git:克隆了整个内容,包括SVN的所有历史记录,标记等。之后对git进行了一些开发。

存储库B:同一个项目,但在版本r+small_number从SVN独立迁移。只有最新的快照被带入git。之后有很多独立的发展。

现在我将A合并为B.想法是SVN将被丢弃,开发将在GitHub上项目回购的develop分支中继续。我用简单的合并来完成这项工作;幸运的是,real conflicts很少。开发主要是在不同的领域,虽然合并后有很多清理,与git无关。

但是:现在当我这样做时merged result上的git rebase -i HEAD~2,我明白应该让我对最后两次提交进行修改,我会收到大约300多份提交的页面 - 自修订版1以来项目的完整历史记录在SVN 。因为害怕搞砸了更多(显然我是一个完整的Git新手),我放弃了rebase。

预期结果如何?这是可取的吗?如果没有,如何解决?

请注意,所有单元测试等都通过,文件本身都可以,只是我不明白git元数据/历史记录发生了什么。

编辑:这就是我 * 认为 * 存储库现在的样子:

          r         A
... o --- o --- ... o 
                     \ 
               B      \    
    o --- .... o ----  o --- ... o 
   r+small_number      C         HEAD

1 个答案:

答案 0 :(得分:8)

我想这种行为的发生是因为你试图通过合并提交来重新定义。

对于以下答案,我假设您的历史记录如下,即存储库A和B完全独立:

          r         A
... o --- o --- ... o

o ... o
r'    B

你需要问问自己你想要达到的目标是什么?所以你想要一个新的分支C包含A和B的变化。这里的优先级是什么?你想要创造一个适当的历史;纠正r'失去SVN历史的事实?或者保持A和B的git历史不变是很重要的吗?

我的回答是假设你想要实现前者。由于A和B都来自非常相似的SVN存储库版本,因此在合并公共历史记录之前为它们提供一个公共的git base 可能是个好主意。所以,理想情况下,在合并之前你会遇到这种情况:

          r          A
... o --- o --- .... o
           \
            \
             o --- .... o
       r+small_number   B

目前,我不确定实现这一目标的最佳方法是哪种,但您可以尝试git rebase -p --onto r --root B

然后你可以git merge A和B结束历史

          r          A     C
... o --- o --- .... o --- o
           \              /
            \            /
             o --- .... o
       r+small_number   B

其中C包含您的所有更改。我可能会把它留在那;没有任何进一步的变基。