【開發工具-Git】Git中合併多個專案並保留所有commit提交記錄
阿新 • • 發佈:2021-12-23
背景
通常的合併專案的做法是,將所有專案移動到一個新目錄中,並重新生成納入 git 管理(去掉了.git 資料夾),這樣做的弊端是之前的歷史提交記錄都沒有了,想要看之前的記錄,還需要再回到舊專案中檢視。
在本文中,我會介紹怎樣完整地保留歷史提交記錄。
為什麼保留提交記錄?
- 可以追蹤檔案修改歷史,方便對比和還原歷史。
- 可以追責,知道之前是誰寫的,什麼時候寫的。
拆分
怎樣完整地保留提交記錄?
假設有三個專案
A:遠端地址為:[email protected]:lyloou/merge_a.git ,分支為master B:遠端地址為:[email protected]:lyloou/merge_b.git ,分支為master C:遠端地址為:[email protected]:lyloou/merge_c.git ,分支為master
合併結果為:[email protected]:lyloou/merge_all.git ,分支為 master
merge_all
-- merge_a
-- merge_b
-- merge_c
操作步驟
- 在本地新建 merge_all 目錄,並初始化
cd merge_all
# 將當前目錄初始化為git版本管理的目錄
git init
- 在 merge_all 中新增 merge_a,merge_b,merge_c 的遠端分支。
git remote add origin_merge_a [email protected]:lyloou/merge_a.git git remote add origin_merge_b [email protected]:lyloou/merge_b.git git remote add origin_merge_c [email protected]:lyloou/merge_c.git
- 可以驗證是否新增成功
git remote -v
- 在 merge_all 目錄下,獲取 merge_a, merge_b,merge_c 的 master 分支資料
git fetch origin_merge_a master
git fetch origin_merge_b master
git fetch origin_merge_c master
- 開始合併了,並移動到子目錄中
# 合併,並保留歷史 git merge origin_merge_a/master --allow-unrelated-histories # 新建子資料夾,並移動到此檔案中(排除需要忽略的資料夾) mkdir merge_a mv !(.|..|.git|merge_a) merge_a # 生成一條commit日誌 git add . && git commit -m "merge merge_a_master and mv to merge_a" git merge origin_merge_b/master --allow-unrelated-histories mkdir merge_b mv !(.|..|.git|merge_b) merge_b git add . && git commit -m "merge merge_b_master and mv to merge_b" git merge origin_merge_c/master --allow-unrelated-histories mkdir merge_c mv !(.|..|.git|merge_c) merge_c git add . && git commit -m "merge merge_c_master and mv to merge_c" # 注意 1: `--allow-unrelated-histories` 的意思是,允許合併不相關歷史 # 注意 2:執行 `mv !(.|..|.git|merge_a) merge_a` 的過程中可能會報錯誤 `-bash: !: event not`,執行一下命令 `shopt -s extglob`
- 推送 merge_all 的 master 分支到遠端
git remote add origin [email protected]:lyloou/merge_all.git
git push -u origin master
至此合併完成就完成了。
參考資料
- Wiz 原文
- git 合併兩個專案 - 掘金
- linux mv 命令排除某個檔案或資料夾_哪懼明天,風高路斜-CSDN 部落格_mv 排除檔案
- command line - What is the purpose of shopt -s extglob - Ask Ubuntu
As you can guess, it stands for extended globbing. This option allows for more advanced pattern matching.