“合并”两个git存储库

时间:2018-04-25 16:07:52

标签: git

我们的git存储库有一些奇怪的情况。 预期的工作流程是创建我们自己的开源项目分支,其中包含我们自己的一些内容。

回购最初是通过复制没有历史记录和“工作正常”的开源项目文件来创建的。 当我们想要更新底层开源代码库时,我们不再合并,而是再次复制文件并使用diff工具手动解析。这是我们真正想要结束的痛苦。

我们希望最终支付技术债务并开始以预期的方式使用git。我们有什么可能的方法来解决它,同时保留我们的历史,并最终拥有潜在的开源历史。 请注意,我们的项目用作子模块,因此我们无法在没有严重后果的情况下创建新的存储库。

这可以修复git的一些秘密功能和很多聪明吗?

1 个答案:

答案 0 :(得分:2)

我这样做。

  • 正常克隆上游回购,包含历史和所有。
  • 在主分支的顶部创建一个分支。
  • 对于每个单独的提交,您必须导出(可能只有顶级提交,除非您有一个有用的近期历史记录):
    • 在您的回购中查看该提交;
    • 将其复制到上游repo树,就像文件一样;
    • 查看更改,还原不需要的部分;
    • 让测试通过等;
    • 承诺改变。

之后您可能需要添加一些更改,以便在当前上游的主服务器之上运行。也提交他们。

现在您在上游主站顶部有一个分支,可以作为拉取请求提供。它保证干净地合并(因为它在master之上,而不是从之前的提交中分支),它有你的更改,它已经通过所有测试(包括测试你的更改)。

如果您想要以前的历史记录供参考,可以选择几种方法。

最简单:将其保留在当前(非上游)回购中。它不会去任何地方,但你必须例如在不同的仓库中哄骗你的变化。

简单但有点愚蠢:在第一次提交之上的上游repo 中创建一个新分支(请参阅these instructions),并将所有历史记录推送到该分支。缺点是你的历史现在与主线的历史无关。

更痛苦的一个:识别您触及上游的点,并根据需要合并。

  • 按照上述步骤在上游回购(baseless_branch)中创建包含历史记录的分支。
  • 确定开始开发的提交,并在其上创建一个新分支(based_branch)。
  • Cherry-选择从baseless_branchbased_branch的提交范围,直到您再次从master复制文件的那一刻。
  • (可选。)实现"复制文件"点,在您复制文件的位置将masterbased_branch合并到master。它应该干净地合并,因为状态是相同的。 (我不知道如何在master中识别这些提交。)
  • 继续采摘樱桃(并合并),直至找到baseless_branch的顶部;现在与master合并,审核并解决冲突,添加所需的更改等。

现在,您拥有自己的分支,从历史中的正确点开始增长,可选择使用与主历史记录匹配的中间合并点。那个分支也是一个很好的公关材料。