Cao Yi

合并不同的仓库

Index

将两个独立的仓库合并成一个仓库并保留两个库的历史。

假设这两个需要合并的仓库是 aaa.gitbbb.git,不妨假设它们都创建在你的 github 账号下。

这里把 bbb.gitmaster 合并到 aaa.gitmaster.

1. 添加源

给一个仓库添加另一个仓库的源

不妨进入 aaa.git 目录,把 bbb.git 作为另一个源添加进来

$ git remote add bbb git@github.com:your_account_id/bbb.git

这时可以看到当前仓库有个两个源

$ git remote -v
origin  git@github.com:your_account_id/aaa.git (fetch)
origin  git@github.com:your_account_id/aaa.git (push)
bbb  git@github.com:your_account_id/bbb.git (fetch)
bbb  git@github.com:your_account_id/bbb.git (push)

2. 准备工作

两个仓库都有 master 分支,不能直接把 bbb.gitmaster 直接 pull 下来。

这里可以考虑按如下顺序处理:

a. 重命名本地的 master

aaa.gitmaster 临时改名为 master-aaa

$ git branch --move master-aaa

b. pull bbb.gitmaster

$ git pull
$ git checkout --track bbb/master

c. 重命名 master

bbb.gitmaster 临时改名为 master-bbb, 将 aaa.gitmaster-aaa 改回 master

$ git branch --move master-bbb
$ git checkout master-aaa
$ git branch --move master

3. 合并

前面都是铺垫,现在才是关键。

$ git checkout master
$ git merge bbb --no-ff
fatal: refusing to merge unrelated histories

不出意外,报错了。fatal: refusing to merge unrelated histories 错误意味着正在尝试合并两个没有共同祖先的分支,默认情况下git是不允许的。 怎么处理?使用参数 --allow-unrelated-histories

$ git merge python --no-ff --allow-unrelated-histories
Auto-merging .gitignore
CONFLICT (add/add): Merge conflict in .gitignore
Automatic merge failed; fix conflicts and then commit the result.
...

上面解决代码冲突的内容这里就不多贴了。

完工。