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到遠程而已。