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

时间:2012-03-20 05:24:45

标签: git git-merge

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

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中开始投影。从图形上看,这将是理想的最终结果

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命令来处理主检查和主树和模块分支之间的同步和同步。这两个解决方案也会导致多个时间轴(使用子节点时,使用--squash时,您甚至可以获得3个单独的时间轴)。

来自SO的最接近的解决方案似乎是在谈论“graft”,但真的是吗?我的目标是拥有一个统一的存储库,我可以拉/推入签到,这样就没有更多的回购B,最后只需回购A.

2 个答案:

答案 0 :(得分:7)

我认为你是这样做的:

  1. git remote add [repo b]
  2. git fetch //将repo b送回repo a
  3. 由于你想保留这样的历史记录: A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(来自repo B)-HEAD(新回购A) 你可以先选择A0作为起点,然后逐个使用git cherry-pick。
  4. 希望这对你有用。

    BR, 添

答案 1 :(得分:0)

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

  1. 转到您的存储库A
  2. git fetch <ref to your repo B> master:new-branch-on-A(因此,您已经将B的主分支复制到了新的分支“ new-branch-on-A”到您的仓库A中。
  3. git checkout new-branch-on-A
  4. git rebase master(您可以通过master分支重新建立A上的新分支)
  5. 解决冲突
  6. git checkout master
  7. git merge new-branch-on-A
  8. git branch -d new-branch-on-A
  9. 完成:),您的历史被合并。我认为在新的历史记录中,来自A的所有提交都比来自B的提交(如果需要,git rebase -i是您的朋友)。