如何合并两个 Git 仓库而不丢失任何一个仓库的提交历史记录

3

我需要将两个代码库合并,但不能丢失它们的历史记录。我在多个论坛上搜索了解决方案,但没有一个能够提供完整的解决方案。通过采用来自不同来源的多个步骤,我成功地将两个独立的代码库合并成一个代码库,并保留它们的历史记录。

有几个其他答案涉及合并分支或仅提供不完整的说明/步骤。

Original Answer翻译成"最初的回答"


1
可能是重复的问题,可以参考如何合并两个Git仓库? - undefined
https://stackoverflow.com/search?q=%5Bgit%5D+merge+two+repositories - undefined
请多介绍一下关于代码库的情况以及你想要做什么。它们是否有不同的分支?还是共用的分支?对它们应该采取什么操作?工作目录又如何?它们是独立的吗?还是需要以某种方式合并? - undefined
嘿@Marcus,这两个仓库是同一个项目,但代码不同,一个仓库有前端代码,另一个仓库有后端代码(我没有参与最初的开发,所以别问为什么会有这样愚蠢的设置)。每个仓库只有一个主分支。由于代码/文件夹结构不同,这两个仓库只需要合并即可。明确点,是和否,如上所述,同一个项目但涉及不同领域的代码。 - undefined
2个回答

7
如果两个仓库都在您的计算机上,例如您有文件夹
A/.git
A/client-src

B/.git
B/server-src

只需前往其中之一:

cd A

并且类型:

git remote add repo-b ../B

这将创建一个从repo-a到repo-b的符号链接(“repo-b”只是一个符号名称,您可以选择任何名称)。然后

git fetch repo-b

将这两个代码库合并。此时,您将在一个仓库中拥有两个历史记录,但仍位于不同的分支中。"master"分支(当前所在文件夹的主分支)将包含客户端代码。"repo-b/master"分支将包含服务器端代码。

然后,您只需要将它们合并即可:

git merge repo-b/master --allow-unrelated

接下来,您将在Repo A中拥有合并的主分支。如果您确信Repo B中没有其他有意义的信息(标签、其他分支),则可以丢弃它并继续使用Repo A进行工作。两个历史记录将保持完整。

为了完整起见,您应该最后删除从Repo-A到Repo-B的无用链接:

git remote remove repo-b

1
以下是步骤。
git clone <NEW REPO>
cd <NEW REPO FOLDER>
dir > README.MD --> this step is just to initiate the new repository.
git commit -m "initiate the new repository"
git remote add -f <RANDOM NAME A> <OLD BRANCH A>
git remote add -f <RANDOM NAME B> <OLD BRANCH B>
git pull origin master --allow-unrelated-histories
git push -u origin master
git merge --allow-unrelated <RANDOM NAME A>/master
git merge --allow-unrelated <RANDOM NAME B>/master
git push origin master

我相信这篇文章对其他人应该会有所帮助。


这不是一种特别好的方法。特别地,这会添加一个无意义的提交来添加名为deleteme.txt的文件,然后保留提交和文件在合并的结果中。这还将两个无关的历史记录与第三个仓库组合在一起,这与问题本身不符,该问题仅提到了两个(而不是三个)输入仓库。最后,它仅合并master分支,而三个仓库都可能有多个分支。但这不是一个*错误的答案:它确实将这三个不同的历史记录联系在一起。 - undefined
@torek,我已经更新了上面的步骤,不再使用deleteme.txt文件,而是可以添加一个readme.md文件。这一步骤是为了初始化新的代码库所必需的。 - undefined
不需要单独初始化,但是如果你想要一个README.md文件,你应该创建一个真正的文件(这也是在合并之前进行第一次提交的好理由,因此以这种方式做是个好主意)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接