我有两个不相关的(不共享任何祖先签入)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中,并使用一个历史时间轴。因此,看起来我最初是在存储库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是一本相当不错的书),但是这两种方法似乎都满足了维护两个独立分支,子模块可以从上游拉取修改,而子树则不那么令人头痛。2这两种解决方案都需要额外的专门的git命令来处理主树和子树/模块分支之间的签入和同步。这两种解决方案都会产生多个时间线(使用子树时,使用--squash可以得到3个独立的时间线)。
来自SO的最接近的解决方案似乎在谈论“graft“,但这真的是它吗?目标是拥有一个单一的统一存储库,在那里我可以拉入/推送签入,这样就不会再有repo B,最终只会有repo A。
3条答案
按热度按时间3npbholx1#
我觉得你应该这样做:
1.因为您希望这样保存历史记录:A0-A1-B1-B 0-D1-C 0-D 0-E0-F0-G 0-E1-H(来自存储库B)-HEAD(新存储库A)您可以先选择A0作为起点,然后使用git cherry-pick一个接一个。
希望这对你有用。
蒂姆·比尔
5kgi1eie2#
我做了类似的事情(将B中的历史合并到A中),如下所示:
1.去你的A店
git fetch <ref to your repo B> master:new-branch-on-A
(因此,您已将B的主分支复制到存储库A的新分支“new-branch-on-A”中。git checkout new-branch-on-A
git rebase master
(用master分支重新确定new-branch-on-A的基址)1.解决冲突(如果有)
git checkout master
git merge new-branch-on-A
git branch -d new-branch-on-A
git rebase -i
是你的朋友)。flmtquvp3#
我相信合并两个不相关历史的正确和最直接的方法是使用普通的
git merge --allow-unrelated-histories
。git-merge
docs[From在“new home”仓库中:]要合并两个仓库,首先将第二个仓库作为远程仓库添加到第一个仓库。然后,运行
git fetch
获取其分支信息:然后,在远程设置之后,使用
--allow-unrelated-histories
标志将第二个存储库的历史记录合并到第一个存储库中: