【開發工具-Git】Git中合並多個項目並保留所有commit提交記錄


背景

通常的合並項目的做法是,將所有項目移動到一個新目錄中,並重新生成納入 git 管理(去掉了.git 文件夾),這樣做的弊端是之前的歷史提交記錄都沒有了,想要看之前的記錄,還需要再回到舊項目中查看。
在本文中,我會介紹怎樣完整地保留歷史提交記錄。

為什么保留提交記錄?

  1. 可以追蹤文件修改歷史,方便對比和還原歷史。
  2. 可以追責,知道之前是誰寫的,什么時候寫的。

拆分

怎樣完整地保留提交記錄?

假設有三個項目

A:遠程地址為:git@github.com:lyloou/merge_a.git ,分支為master
B:遠程地址為:git@github.com:lyloou/merge_b.git ,分支為master
C:遠程地址為:git@github.com:lyloou/merge_c.git ,分支為master

合並結果為:git@github.com:lyloou/merge_all.git ,分支為 master

merge_all
  -- merge_a
  -- merge_b
  -- merge_c

操作步驟

  1. 在本地新建 merge_all 目錄,並初始化
cd merge_all
# 將當前目錄初始化為git版本管理的目錄
git init
  1. 在 merge_all 中添加 merge_a,merge_b,merge_c 的遠程分支。
git remote add origin_merge_a git@github.com:lyloou/merge_a.git
git remote add origin_merge_b git@github.com:lyloou/merge_b.git
git remote add origin_merge_c git@github.com:lyloou/merge_c.git
  1. 可以驗證是否添加成功git remote -v
  2. 在 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
  1. 開始合並了,並移動到子目錄中
# 合並,並保留歷史
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`
  1. 推送 merge_all 的 master 分支到遠程
git remote add origin git@github.com:lyloou/merge_all.git
git push -u origin master

至此合並完成就完成了。

參考資料

As you can guess, it stands for extended globbing. This option allows for more advanced pattern matching.

閱讀原文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM