关于git merge:如何将两个独立的无关Git存储库合并为一个具有单个历史时间轴的存储库

How to combine two separate unrelated Git repositories into one with single history timeline

我有两个不相关(不共享任何祖先签入)的Git存储库,一个是由许多较小的项目组成的超级存储库(我们称之为存储库A)。另一个只是一个小型项目的临时本地Git存储库(我们称之为存储库B)。从图形上看,应该是这样的

1
2
3
A0-B0-C0-D0-E0-F0-G0-HEAD (repo A)
A0-B0-C0-D0-E0-F0-G0-HEAD (remote/master bare repo pulled & pushed from repo A)
A1-B1-C1-D1-E1-HEAD (repo B)

理想情况下,我真的希望将回购B合并到回购A中,并有一个单一的历史时间表。所以看起来我最初是在repo a中启动项目的。从图形上看,这将是理想的最终结果。

1
2
A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (new repo A)
A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (remote/master bare repo pulled & pushed from repo A)

我一直在阅读子模块和子树(顺便说一句,pro-git是一本不错的书),但这两本书似乎都迎合了维护两个独立的分支的解决方案,子模块能够从上游提取更改,子树的头痛程度稍微小一些。这两种解决方案都需要额外的和专门的git命令来处理签入,并在主树和子树/模块分支之间进行同步。这两种解决方案也会导致多个时间线(使用子树时,甚至可以获得3个单独的时间线--挤压)。

最接近的解决方案似乎是"移植",但这真的是吗?我们的目标是拥有一个单一的统一存储库,在这里我可以拉/推签入,这样就没有更多的repo b了,最后只需要repo a。


我想你是这样做的:

  • git远程添加[repo b]
  • git fetch//将回购B纳入回购A
  • 因为你想保持这样的历史:a0-a1-b1-b0-d1-c0-d0-e0-f0-g0-e1-h(来自回购B)-头(新回购A)您可以首先选择a0作为起点,然后使用git cherry逐个选择。
  • 希望这对你有用。

    Br提姆


    我做了类似的事情(将历史从B合并到A),比如:

  • 去你的回购A
  • git fetch master:new-branch-on-A(因此,您已将b的主分支复制到新分支'new-branch-on-a'中,并将其复制到您的repo a中。
  • 江户十一〔一〕号
  • git rebase master(您将新的on-a分支与主分支重新平衡)
  • 解决冲突(如果有)
  • 埃多克斯1〔3〕
  • 江户十一〔四〕号
  • 埃多克斯1〔5〕
  • 完成:),您的历史记录被合并。我认为在新的历史上,所有来自A的承诺都是在来自B的承诺之前(如果需要,git rebase -i是你的朋友)。