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

Rad*_*dim 3 svn git git-merge git-rebase

存储库A:在修订时从项目的SVN迁移到git r:克隆整个事物,包括SVN的所有历史,标记等.之后对git进行一点开发.

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

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

但是:现在,当我做,例如git rebase -i HEAD~2合并后的结果,我的理解应该让我重订的最后两次提交,我招呼着一些300+的页面提交- 该项目的全部历史,因为在SVN版本1.我因为害怕搞砸了而放弃了这一点(显然我是一个完整的Git新手).

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

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

编辑:这是我**库貌似现在:

          r         A
... o --- o --- ... o 
                     \ 
               B      \    
    o --- .... o ----  o --- ... o 
   r+small_number      C         HEAD
Run Code Online (Sandbox Code Playgroud)

Lar*_*ski 8

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

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

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

o ... o
r'    B
Run Code Online (Sandbox Code Playgroud)

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

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

          r          A
... o --- o --- .... o
           \
            \
             o --- .... o
       r+small_number   B
Run Code Online (Sandbox Code Playgroud)

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

那么你可以只用git mergeA和B来结束历史

          r          A     C
... o --- o --- .... o --- o
           \              /
            \            /
             o --- .... o
       r+small_number   B
Run Code Online (Sandbox Code Playgroud)

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