【问题标题】:How to combine two separate unrelated Git repositories into one with single history timeline如何将两个独立的不相关 Git 存储库合并为一个具有单一历史时间线的存储库
【发布时间】:2012-03-20 05:24:44
【问题描述】:

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

理想情况下,我真的很想将 repo B 合并到 repo 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”,但真的是这样吗?目标是拥有一个统一的存储库,我可以在其中拉入/推送签入,这样就没有更多的 repo B,最后只有 repo A。

【问题讨论】:

标签: git git-merge


【解决方案1】:

我认为你是这样做的:

  1. git 远程添加 [repo b]
  2. git fetch//把repo b放到repo a中
  3. 由于您想保留这样的历史记录: A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(来自回购 B)-HEAD(新回购 A) 您可以先选择A0作为起点,然后逐个使用git cherry-pick。

希望这对你有用。

兄弟, 蒂姆

【讨论】:

  • 将您的解决方案与本指南 @gbayer.com/development/… 结合起来,它可以工作!
  • 您可以使用“git cherry-pick startHash^..lastHash”选择完整范围,并在每次手动合并后使用“git cherry-pick --continue”。
【解决方案2】:

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

  1. 去你的repo 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(你将 new-branch-on-A 与 master 分支变基)
  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 是你的朋友)。

【讨论】:

  • 这就像一个冠军,很容易理解。谢谢!
猜你喜欢
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2023-04-09
  • 2016-04-18
相关资源
最近更新 更多