如何将两个独立的不相关的Git仓库合并为一个具有单一历史时间轴的仓库

lyr7nygr  于 2023-03-11  发布在  Git
关注(0)|答案(3)|浏览(312)

我有两个不相关的(不共享任何祖先签入)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。

3npbholx

3npbholx1#

我觉得你应该这样做:

  1. git远程添加[存储库B]
  2. git fetch//将存储库B放入存储库a
    1.因为您希望这样保存历史记录:A0-A1-B1-B 0-D1-C 0-D 0-E0-F0-G 0-E1-H(来自存储库B)-HEAD(新存储库A)您可以先选择A0作为起点,然后使用git cherry-pick一个接一个。
    希望这对你有用。
    蒂姆·比尔
5kgi1eie

5kgi1eie2#

我做了类似的事情(将B中的历史合并到A中),如下所示:
1.去你的A店

  1. git fetch <ref to your repo B> master:new-branch-on-A(因此,您已将B的主分支复制到存储库A的新分支“new-branch-on-A”中。
  2. git checkout new-branch-on-A
  3. git rebase master(用master分支重新确定new-branch-on-A的基址)
    1.解决冲突(如果有)
  4. git checkout master
  5. git merge new-branch-on-A
  6. git branch -d new-branch-on-A
  7. Done:),你的历史记录被合并了。我认为在新的历史记录中,所有来自A的提交都在来自B的提交之前(如果需要,git rebase -i是你的朋友)。
flmtquvp

flmtquvp3#

我相信合并两个不相关历史的正确和最直接的方法是使用普通的git merge --allow-unrelated-histories​

[From在“new home”仓库中:]要合并两个仓库,首先将第二个仓库作为远程仓库添加到第一个仓库。然后,运行git fetch获取其分支信息:

git remote add repo-to-insert ../local/path/to/other/repo
git fetch repo-to-insert

然后,在远程设置之后,使用--allow-unrelated-histories标志将第二个存储库的历史记录合并到第一个存储库中:

git merge repo-to-insert/branch-to-merge --allow-unrelated-histories
Merge made by the 'recursive' strategy.
 two.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 two.txt

相关问题