《Git/Gitlab進階》十五:合并兩個項目為一個并保留合并前所有歷史記錄

本章主要測試講解

  • 如何將兩個 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)容如下:

1.png

使用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 項目的絕對路徑 陆爽。

如下圖:

2.png

合并添加的庫 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錯誤臀栈。

如下圖:

3.png

創(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ù)一下屎开。

如下圖(再次提醒阐枣,=前后不要空格):

4.png

完成 moment 轉(zhuǎn)移提交

上一步已經(jīng)修復(fù)了文件數(shù),執(zhí)行完之后奄抽,仍然在 MERGING 狀態(tài)蔼两,需要提交一次修改。

使用命令:

git commit --message '完成moment 的遷移如孝,新目錄為 mtool'

如下圖(MERGING 過成已完成):

5.png

完成 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 中,完成忽略文件的合并易桃。

如下圖:

6.png

到這里褥琐,合并作業(yè)就基本完成了,最后在添加提交一次晤郑,做合并項目的記錄

git add --all;
git commit --message '遷移整合完成敌呈!'

如下圖:

7.png

合并前后的文件夾結(jié)構(gòu)如下:

8.png

查看合并后的項目歷史記錄嚼鹉,如下圖:

9.png

提交數(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 文件夾。

  1. $ [~] cd frontend
  2. $ [frontend] git remote add -f backend /fullpath/to/backend
  3. $ [frontend] git merge --strategy ours --no-commit backend/master
  4. $ [frontend] mkdir -p server
  5. $ [frontend] git read-tree --prefix=server/ -u backend/master
  6. $ [frontend] git commit --message '完成 backend 的遷移尖昏,新目錄為 server'
  7. $ [frontend] mkdir -p client
  8. # 拷貝 frontend 的原始項目文件(除了 .git/ 和 .gitignore 以外) 至 client/
  9. $ [frontend] cd ..; mv frontend/ project/; cd project
  10. $ [project] cat server/.gitignore >> .gitignore
  11. # 整理合并后的 .gitignore仰税,修復(fù)其中的路徑缺失并保存;修復(fù)各種項目依賴的缺失抽诉,本地測試陨簇。
  12. $ [project] git add --all; git commit --message '遷移整合完成!'

參考文件:
https://segmentfault.com/a/1190000000678808

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迹淌,一起剝皮案震驚了整個濱河市河绽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唉窃,老刑警劉巖耙饰,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異句携,居然都是意外死亡榔幸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門矮嫉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來削咆,“玉大人,你說我怎么就攤上這事蠢笋〔ζ耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵昨寞,是天一觀的道長瞻惋。 經(jīng)常有香客問我厦滤,道長,這世上最難降的妖魔是什么歼狼? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任掏导,我火速辦了婚禮,結(jié)果婚禮上羽峰,老公的妹妹穿的比我還像新娘趟咆。我一直安慰自己,他們只是感情好梅屉,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布值纱。 她就那樣靜靜地躺著,像睡著了一般坯汤。 火紅的嫁衣襯著肌膚如雪虐唠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天惰聂,我揣著相機與錄音疆偿,去河邊找鬼。 笑死庶近,一個胖子當(dāng)著我的面吹牛翁脆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鼻种,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沙热!你這毒婦竟也來了叉钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤篙贸,失蹤者是張志新(化名)和其女友劉穎投队,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爵川,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡敷鸦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寝贡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扒披。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圃泡,靈堂內(nèi)的尸體忽然破棺而出碟案,到底是詐尸還是另有隱情,我是刑警寧澤颇蜡,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布价说,位于F島的核電站辆亏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鳖目。R本人自食惡果不足惜扮叨,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望领迈。 院中可真熱鬧彻磁,春花似錦、人聲如沸惦费。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薪贫。三九已至恍箭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞧省,已是汗流浹背扯夭。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鞍匾,地道東北人交洗。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像橡淑,于是被迫代替她去往敵國和親构拳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容