本章主要測試講解
- 如何將兩個 git 管理的項目合并成一個項目簿透,并保留住各自項目中所有的歷史提交記錄抖甘。(后續(xù)可以自行拓展到三個、四個……的合并)
本篇內(nèi)容捌治,不建議跳過,如果有這個需求纽窟,還請仔細(xì)詳細(xì)查看肖油,謝謝。
測試過程
前置說明
git 管理的項目合并臂港,還要保留之前的提交歷史記錄森枪,則表明不能直接異動到原項目.git 文件夾倉庫,需要通過其它方式把子項目的.git 文件夾合并到一起审孽,才能保存住所有提交信息县袱。
項目準(zhǔn)備
- 先從 github 克隆了兩個項目用于測試,一個是 dayjs佑力,一個是 moment式散;
- 計劃是把 dayjs 和 moment 合并為一個項目,名為 timetools打颤;
- 該項目包含兩個文件夾暴拄,一是 dtool,對應(yīng)原本的 dayjs瘸洛;
- 二是 mtool揍移,對應(yīng)原本的 moment。
效果反肋,合并前
- dayjs => 獨立的 dayjs 項目那伐,有自己的.gitignore 和 .git/
- moment => 獨立的 moment 項目,有自己的.gitignore 和 .git/
合并后:
- timetools/ => 即最開始的 dayjs,整合完后更名
- .gitignore => 合并兩個 repos 的忽略文件
- .git/ => 最終僅余一個 repo
+ dtool/ => 對應(yīng) dayjs
+ mtool/ => 對應(yīng) moment
克隆的項目罕邀,內(nèi)容如下:
使用git log --oneline | wc -l
獲取提交數(shù)量畅形。
粗略可見,dayjs 的提交為 1046 次诉探,moment 提交為 3724 次日熬。
注意分支名,dayjs 為 dev肾胯,moment 為 develop竖席。
大概流程
- 1 進入 dayjs 文件夾,將 moment 作為遠(yuǎn)程倉庫添加到 dayjs 來敬肚;
- 2 合并添加的庫 moment 到原本的 dayjs 項目毕荐;
- 3 創(chuàng)建 mtool 文件夾,把 moment 的 develop 分支合并到 mtool 文件夾艳馒;
- 4 完成 moment 轉(zhuǎn)移提交憎亚;
- 5 完成 dayjs 文件的遷移;
- 6 完成項目合并并查看歷史記錄弄慰。
測試步驟
進入 dayjs 文件夾第美,將 moment 作為遠(yuǎn)程倉庫添加到 dayjs 來
使用命令:
git remote add -f moment D:/davidsu/Desktop/GitlabTest/full/moment
命令說明:
git remote add
添加遠(yuǎn)程倉庫路徑
- -f 的作用是在添加后立刻 fetch。
-
D:/davidsu/Desktop/GitlabTest/full/
為需要被合并 moment 項目的絕對路徑 陆爽。
如下圖:
合并添加的庫 moment 到原本的 dayjs 項目
使用命令(注意分支名):
git merge --strategy ours --no-commit --allow-unrelated-histories moment/develop
命令說明:
git merge
為合并分支
- –strategy ours 解析合并什往,在合并時,如果遇到?jīng)_突墓陈,以我的為準(zhǔn)恶守。(本例是在 dayjs 中合并 moment,遇到?jīng)_突以 dayjs 的為準(zhǔn))贡必。結(jié)果就是:
- moment 的歷史記錄被合并到 dayjs 的歷史記錄中兔港。
- moment 的文件樹被讀取并和 dayjs 的文件樹比對進行沖突解析。
- –no-commit 合并解析完成后中斷仔拟,停留在最后的提交步驟之前衫樊。
- 只要你還沒 commit,那么 merge 的結(jié)果就暫時保存在緩存區(qū)中利花,只有完成提交步驟合并才算徹底完成(文件樹被正式改變)科侈。
- –allow-unrelated-histories 允許合并無關(guān)的歷史記錄。
- 如果不添加此選項炒事,可能會出現(xiàn)
fatal: refusing to merge unrelated histories
錯誤臀栈。
- 如果不添加此選項炒事,可能會出現(xiàn)
如下圖:
創(chuàng)建 mtool 文件夾,把 moment 的 develop 分支合并到 mtool 文件夾
使用命令:
mkdir mtool # 創(chuàng)建文件夾
git read-tree --prefix=mtool/ -u moment/develop
命令說明:
git read-tree
給定的樹信息讀入索引
- –prefix 用于指定文件樹讀取后保存的路徑挠乳,相對于當(dāng)前路徑并且一定要追加 /权薯。
- -u 是說在讀取后更新 index姑躲,使得 working tree 與 index 保持同步。
這個命令的意義在于盟蚣,之前的git merge
命令可能會在解決沖突的時候黍析,把 moment 的文件樹弄得比較混亂,再使用read-tree
去修復(fù)一下屎开。
如下圖(再次提醒阐枣,=前后不要空格):
完成 moment 轉(zhuǎn)移提交
上一步已經(jīng)修復(fù)了文件數(shù),執(zhí)行完之后奄抽,仍然在 MERGING 狀態(tài)蔼两,需要提交一次修改。
使用命令:
git commit --message '完成moment 的遷移如孝,新目錄為 mtool'
如下圖(MERGING 過成已完成):
完成 dayjs 文件的遷移
以上宪哩,已把 momet 項目遷移到了 dayjs 下的 mtool 文件夾了。現(xiàn)在要遷移 dayjs 文件夾了第晰。
在 dayjs 文件夾下,新建文件夾 dtool
mkdir dtool
再把所有原本屬于 dayjs 的文件移動到新建的 dtool 去彬祖。
也就是除了 dtool/茁瘦、mtool/、.git/储笑、.gitignore 之外的所有甜熔。
剪切完之后,把這個原本的 dayjs 的文件夾重命名為 timetools突倍。
完成項目合并并查看歷史記錄
到這一步腔稀,原本的 dayjs 項目,就變成了 timetools 項目羽历,里面的 dtool 文件夾就是 dayjs 項目焊虏。
不過還差一點,之前只是把文件放進去了秕磷,還需要合并.gitignore 文件诵闭。
在新的 timetools 文件夾下,運行:
cat mtool/.gitignore >> .gitignore
把原本 moment 項目澎嚣,現(xiàn)在的 mtool 文件夾下的.gitignore 的內(nèi)容疏尿,合并到現(xiàn)在 timetools 文件夾下的.gitignore 中,完成忽略文件的合并易桃。
如下圖:
到這里褥琐,合并作業(yè)就基本完成了,最后在添加提交一次晤郑,做合并項目的記錄
git add --all;
git commit --message '遷移整合完成敌呈!'
如下圖:
合并前后的文件夾結(jié)構(gòu)如下:
查看合并后的項目歷史記錄嚼鹉,如下圖:
提交數(shù):4772 = 1046 + 3724 + 2。
總結(jié)
以上驱富,完成了兩個項目合并到一個項目的示例接操作演示锚赤,后續(xù)有更多的項目想要合并,可以類似褐鸥。
本示例使用步驟
- 進入 dayjs
- git remote add -f moment D:/davidsu/Desktop/GitlabTest/full/moment
- git merge –strategy ours –no-commit –allow-unrelated-histories moment/develop
- mkdir mtool
- git read-tree –prefix=mtool/ -u moment/develop
- git commit –message ‘完成 moment 的遷移线脚,新目錄為 mtool’
- mkdir dtool (還在 dayjs 下面)
- 拷貝 dayjs 的原始項目文件(除了 .git/ 和 .gitignore 以外)至 dtool/;
- 拷貝完之后叫榕,可以把原本文件夾名 dayjs 改為 timetools浑侥;
- 把此時 mtool 下的.gitignore 文件內(nèi)容,整理合并到 timetools 下的.gitignore 文件中去晰绎。
- 合并完之后寓落,再全部添加提交一次,做為整合操作的記錄:
- git add –all; git commit –message ‘遷移整合完成荞下!’
整理引用原作者步驟:
目標(biāo):將 frontend 項目與 backend 項目伶选,合并到 project 項目下的 client 文件夾與 server 文件夾。
- $ [~]
cd frontend
- $ [frontend]
git remote add -f backend /fullpath/to/backend
- $ [frontend]
git merge --strategy ours --no-commit backend/master
- $ [frontend]
mkdir -p server
- $ [frontend]
git read-tree --prefix=server/ -u backend/master
- $ [frontend]
git commit --message '完成 backend 的遷移尖昏,新目錄為 server'
- $ [frontend]
mkdir -p client
# 拷貝 frontend 的原始項目文件(除了 .git/ 和 .gitignore 以外) 至 client/
- $ [frontend]
cd ..; mv frontend/ project/; cd project
- $ [project]
cat server/.gitignore >> .gitignore
# 整理合并后的 .gitignore仰税,修復(fù)其中的路徑缺失并保存;修復(fù)各種項目依賴的缺失抽诉,本地測試陨簇。
- $ [project]
git add --all; git commit --message '遷移整合完成!'