由于国内的网络问题,我在把代码推送到 github 上的时候经常性会遇到一些问题,比如上传失败,这个问题与我家的网络没有本质的关联,主要还是网络提供商(电信)的问题。因此我为了提高自己写代码的体验,选择将代码直接推送到国内的托管上 coding 上,但是这次写的代码是为了开源之夏的项目,结项的时候必须看到代码的提交过程,且代码仓库必须是项目一开始的仓库,而我最开始的时候忘了这茬事,因此我就需要将两个不相关的 git 仓库合并,且保留原仓库中的提交记录!

操作也不是特别复杂,如下代码所示。

首先我们需要明确哪两个代码仓库进行合并:

  1. repo1
  2. repo2

合并之前最好把两个仓库的修改都提交了,保持仓库的干净。

最好能新建一个文件夹,然后把两个代码仓库重新克隆到这个新文件夹中。

然后我们将其中一个仓库(repo2)放入另一个仓库(repo1)中。

那么我们就得到了这样一个目录结构:

repo1
    - repo2

而后我们进入 repo1 中:

cd repo1

我们将 repo2 设置为 repo1 的一个源。

git remote add test ./repo1

我也是到这里才知道 git 仓库的源还可以是本地的一个文件夹。

我猜测这种合并两个仓库的原理是将一个仓库作为另一个仓库的子仓库,然后签出分支进行合并。

然后我们抓取这个仓库,这个指令会将 repo2 的数据移动到 repo1 下(也就是跟原来的 repo2 平级)。

git fetch repo2

然后我们将 repo2 中需要的分支签出,变成 repo1 的一个分支。

git checkout -b test test/master

这样我们就得到了一条待合并的代码分支,接下来就是将这条分支和 repo1 的分支进行合并。所以我们先切回到主分支:

git checkout master

最后合并前文签出的子分支,这里要注意添加--allow-unrelated-histories,因为这两个仓库是毫不相关的,因此不能直接合并,如果没有这个参数就会出现冲突。

git merge test --allow-unrelated-histories

最后我们可以删除 repo1 下的 repo2 文件夹

rm -rf ./repo2

最后我们就得到了一个合并好的 repo1。