Git Subtree 輕鬆合併專案,保留完整 commit 歷史
在軟體開發的過程中,時常會遇到這樣的需求:
- 你有一個現有的 Git 專案,但需要將另一個儲存庫的內容整合進來,並且希望保留完整的 commit 歷史。
這時,Git 提供了幾種不同的方式來達成這個目標,其中 Git Subtree 是一個簡單又強大的解法。
本文將帶你了解 Git Subtree 的用途、與 Submodule 的差異,以及如何實際操作,讓你的開發流程更順暢!
為什麼需要整合外部 Git 儲存庫?
在多人協作或模組化開發的情境下,將外部專案整合到目前的主專案中是相當常見的需求,例如:
- 你正在開發一個 微服務架構,每個服務有獨立的 Git 儲存庫,但你希望它們統一管理在同一個專案下。
- 你的專案需要引入某個 舊專案的程式碼,但你又不想失去它的歷史紀錄。
Git Submodule vs. Git Subtree:哪種適合你?
Git Submodule
- 概念: Submodule 會把另一個 Git 儲存庫當作「子模組」,專案本身只會記錄這個子模組的「版本指標」,但不會直接包含它的內容。
- 優點: 保持外部專案的獨立性,適合用於需要獨立維護的第三方庫。
- 缺點: 需要額外管理 Submodule 的版本,對團隊協作來說較為複雜。
Git Subtree
- 概念: Subtree 會直接把外部儲存庫的內容合併到專案內的某個子目錄,並保留完整的 commit 歷史。
- 優點: 外部專案的內容會直接存在於主專案中,使用上較直覺。
- 缺點: 如果外部專案頻繁更新,需要手動執行
git subtree pull
來同步變更。
使用 Git Subtree 合併外部儲存庫
1. 新增外部儲存庫作為遠端
git remote add your-old-repo git@github.com:xxxx/aabbb.git
2. 拉取外部儲存庫的內容
git fetch your-old-repo --no-tags
3. 使用 Git Subtree 合併外部專案
git subtree add --prefix=apps/testa your-old-repo master
4. 移除不需要的遠端設定
git remote remove your-old-repo
5. 推送變更到遠端儲存庫
git push origin master
如何同步外部專案的更新?
如果外部專案(your-old-repo)有新的變更,你可以使用以下指令同步:
git subtree pull --prefix=apps/testa your-old-repo master
總結
Git Subtree 提供了一種簡單且直覺的方式,讓我們可以將外部專案的內容整合進來,並且保留完整的 commit 歷史。
- 如果你不想要處理 Submodule 帶來的繁瑣設定,Git Subtree 會是更好的選擇。
- 透過
git subtree pull
可以輕鬆同步上游變更,保持程式碼最新。
希望這篇文章能幫助你更順利地整合不同的 Git 儲存庫,讓你的開發流程更順暢! 🚀