我有两个不相关的(不共享任何祖先签入)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.
答案 0 :(得分:7)
我认为你是这样做的:
希望这对你有用。
BR, 添
答案 1 :(得分:0)
我做了类似的事情(将历史从B合并到A):
git fetch <ref to your repo B> master:new-branch-on-A
(因此,您已经将B的主分支复制到了新的分支“ new-branch-on-A”到您的仓库A中。git checkout new-branch-on-A
git rebase master
(您可以通过master分支重新建立A上的新分支)git checkout master
git merge new-branch-on-A
git branch -d new-branch-on-A
git rebase -i
是您的朋友)。