1、前言
本文档为跨git仓库合并代码并保留commit历史记录提供理论基础和指导。
本文档读者要具备对git仓库,本地仓库、远程仓库的深刻认识。
2、理论基础
- git是一个完整的本地版本管理系统。
- git本地仓库和远程仓库没有区别
- 跨仓库合并代码,本质是将A仓库作为B仓库的远程仓库,并将A、B仓库关联起来,即可作为一个仓库进行操作。
3、前提条件
准备两个仓库,本地初始化两个仓库即可演示。
仓库A: repo_A
仓库B: repo_B
初始化两个仓库,每个仓库提交一个文件,并多commit几次,形成提交记录。
本地演示目录: /d/workspace/acrossRepos
仓库目录
/d/workspace/acrossRepos/repo_A/.git
/d/workspace/acrossRepos/repo_B/.git
仓库repo_A创建repo_A.txt文件,提交2次。
仓库repo_B创建repo_B.txt文件,提交2次。
4、合并目标
将仓库repo_B的文件及提交记录合并到仓库repo_A中
即在仓库repo_A中,可以看到repo_B的文件,使用git log可以看到repo_B的提交记录
5、合并流程
第一步,将repo_B作为repo_A的远程仓库,即repo_A作为本地仓库。repo_B作为远程仓库。
将repo_B作为远程仓库添加到repo_A中,并给repo_B起个别名repo_BB,远程分支名默认为origin。
第二步:fetch远程仓库repo_BB到本地
第三步:创建本地分支并关联远程分支,repo_B仓库只有master分支,故使用master分支演示。
本地创建分支名为:repo_B_master_branch,该分支内容与repo_B的master分支相同。
第四步:切换到repo_A的master分支,准备从repo_A仓库的repo_B_master_branch分支合并repo_B仓库的master分支的代码和历史记录。
第五步:从repo_B_master_branch 分支merge 或cherry-pick到repo_A仓库master分支。merge的时候会报错:
意思是两个仓库的历史记录没有任何关联,拒绝合并。加如下参数允许合并:
--allow-unrelated-histories
合并后,使用git log查看repo_A仓库的历史记录
6、Q&A
如果涉及到远程仓库,仅仅多了合并前把远程仓库clone/pull到本地,合并后把本地仓库push到远程而已。