我有两个不相关的(不共享任何祖先签入)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)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我真的想将回购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)
Run Code Online (Sandbox Code Playgroud)
我一直在用子模块和子树进行一些阅读(顺便说一句,Pro Git是一本非常好的书),但它们似乎都能解决维护两个独立分支的问题,子模块能够从上游和子树略微拉动少头痛.这两种解决方案都需要额外的专用git命令来处理主检查和主树和模块分支之间的同步和同步.这两种解决方案也会产生多个时间轴(使用子树时,使用--squash时,您甚至可以获得3个单独的时间轴).
来自SO的最接近的解决方案似乎是在谈论" 移植 ",但真的是吗?我的目标是拥有一个统一的存储库,我可以在其中拉/推入签到,这样就没有更多的回购B,最后只需回购A.
我想你是这样做的:
希望这对你有用.
布朗,蒂姆
我做了类似的事情(将历史从 B 合并到 A),如下所示:
git fetch <ref to your repo B> master:new-branch-on-A (因此,您已将 B 的主分支复制到您的仓库 A 中的新分支“new-branch-on-A”中。git checkout new-branch-on-Agit rebase master (您使用 master 分支将新分支重新建立在 A 上) git checkout mastergit merge new-branch-on-Agit branch -d new-branch-on-Agit rebase -i如果需要,是你的朋友)。小智 5
我相信合并两个不相关的历史的正确且最直接的方法是使用 plain 来完成git merge --allow-unrelated-histories\xe2\x80\x8b。
\n\n[从“新主页”存储库中:] 要合并两个存储库,首先将第二个存储库添加为第一个存储库的远程存储库。然后,运行
\ngit fetch以获取其分支信息:Run Code Online (Sandbox Code Playgroud)\ngit remote add repo-to-insert ../local/path/to/other/repo\ngit fetch repo-to-insert\n然后,设置远程后,使用以下标志将第二个存储库\xe2\x80\x99s 历史记录合并到第一个存储库中
\n--allow-unrelated-histories:Run Code Online (Sandbox Code Playgroud)\ngit merge repo-to-insert/branch-to-merge --allow-unrelated-histories\nMerge made by the \'recursive\' strategy.\n two.txt | 0\n 1 file changed, 0 insertions(+), 0 deletions(-)\n create mode 100644 two.txt\n