Git Merge两个存储库,它们存在数千个冲突,相隔数年

时间:2014-12-22 13:59:28

标签: git merge repository branch fork

存储库A:我们现在正在处理的旧分支,但最近有数百个来自B的3年代码的提交。历史早已不复存在 - 它只会回归存储库首次上传到Github的几个月。

存储库B:我们无法访问的新的当前存储库。多年的历史。想要在完成后继续更新它的Master分支。

在某些时候〜3年前,存储库A是B的一个分支,然后从未与B保持同步。我们想改变它。我们希望成为存储库B,包含来自A的所有更改。

我认为需要发生的伪代码:

  1. 使用[Master]分支将B克隆到新项目中。
  2. 制作一个包含所有A的
  3. 将[Old]分支合并到[Master]分支并修复数千个冲突(我们如何保留A的历史记录?)
  4. 为Repo B设置上游遥控器,以便从现在开始保持最新状态。
  5. 我希望得到一些建议,澄清和/或上述伪代码的翻译以及它的工作方式。

    谢谢!

2 个答案:

答案 0 :(得分:1)

从概念上讲,你想做的事情很简单;唯一复杂的因素是预期冲突的绝对数量。您可以做的一件事就是首先尝试将B的旧提交合并到A。假设你git clone B Blocal后,你有这样的事情:

*---......-----*  A/master

*---......-----*  Blocal/master

不是一次性将B/master合并到A/master,而是以小块合并。

git remote add Blocal
git fetch
git merge  <some old commit in Blocal/master>

,在确定可能少得多的冲突之后,您将拥有

           M1
*--...---*-* A/master
          /
*--....--*--...........................--* Blocal/master

其中M1(以及Mi一般来说下面的`)是合并提交。

然后,在Blocal/master中稍微更新一次提交。

           M1         M2
*--...---*-*--------*-* A/master
          /          /
*--....--*--......--*--.....................--* Blocal/master

保持这种状态,一次只有Blocal/master,直到你终于可以运行

git merge Blocal/master

获得类似

的内容
           M1         M2       M3          Mn
*--...---*-*--------*-*--..--*-*--.....--*-* A/master
          /          /        /           /
*--....--*--......--*--................--* Blocal/master

这样,您就不必立即处理所有合并冲突。您可以通过检查Blocal/master&#39;历史,找到合并的好地方,导致更少的合并冲突。

完成合并后,您可以设置A/master来跟踪真实B,而不是本地克隆。

git branch --track B/master

答案 1 :(得分:1)

您可能最终导入的导入类似于How to import existing Git repository into another?中的情况。

听起来像你想要像Jörg在他的回答(https://stackoverflow.com/a/1684435/47392)中所建议的那样,这实际上是基于Linus Torvald的“Coolest Merge EVER”。