[Git] Git 合併策略
前言
因為最近剛就職到第三家公司,用的是之前從沒用過的 fast-forward merge,之前每家公司也都用不一樣的策略,像是 rebase, squash, merge 等等, 所以想來整理一下 git 的合併策略,釐清概念和了解各種方式的優缺點
看完 ByteByteGo 的影片 後了解,主要分為兩個部分:
- 將 main 的更新加到 feature
- 將 feature 合回 main
因此下面會以這兩個部分不同的 Git 策略來做介紹
將 main 的更新加到 feature
主要目的:讓現在開發的分支提早跟 main 整合,避免最後合併回 main 時,出現大量的衝突
Merge
將 main 新的變更帶到 feature,同時建立一個新的 commit 點,feature 和 main 的歷史紀錄都會被保留,但 Git tree 會變得很混亂
Rebase
將 feature 的根基移到最新 main 的 commit 點上,偽裝成就好像是剛從 main 最新點新開的一個 branch 一樣, 以達成更新,讓我們的 history 更乾淨和直觀
將 feature 合回 main
主要目的:將分別開發的 feature 合併回 main branch,上到正式的環境,像是 dev, stg, prod 等等
Merge
將 feature merge 回 Main,同時產生一個新的 commit 點
優點:
- feature 和 main 的所有歷史紀錄都會被保留
缺點:
- 到最後太多分支會變得很混亂,歷史紀錄也很複雜
Fast-forward merge
在 feature 的起始根節點為 main 的最新 commit 點的前提下 (可透過前面的 rebase 達成), 將 feature 直接合併回 main
透過 main 直接指到 feature 的最新 commit 點,不會產生新的 commit 點
優點:
- 會讓所有的 git history 都在一直線上,非常乾淨
- 不會有新的 commit 點產生
若要執行 Fast-forward merge,feature 的根節點一定要在 main 的最新節點上,這樣 main 才可以無縫串接 feature 所有的 commit 點
Squash
將 feature 所有的 commit 點都壓縮 (squash) 成一個 commit 點,並將此 commit 點 merge 回 main branch,達成將 feature 合併回 main 的目的
優點:
- main 乾淨又整齊,不會有太多的 commit 點
缺點:
- feature 的 history 會消失,但可以把 feature 的 commit messages 都加到 squash commit 的 comment 中,作為補償
合併策略比較
合併回 main
strategy | merge | fast-forward | squash |
---|---|---|---|
Pros | 保留完整的 commit 歷史,包括所有分支上的變更 | 保持線性歷史,簡單清晰 | 將多個 commit 壓縮成一個,保持歷史簡潔 |
Cons | 可能導致 commit 歷史混亂,特別是在進行大量的合併操作時 |
更新 feature
strategy | merge | rebase |
---|---|---|
Pros | 保留完整的 commit 歷史,包括所有分支上的變更 | 保持線性和乾淨的 commit 歷史,便於查看和理解 |
Cons | 可能導致歷史混亂,特別是經常合併的分支 |
參考資源
- Git MERGE vs REBASE: Everything You Need to Know - YouTube
- GIT Fast Forward Visualized - YouTube
- Fast-forward merges are the future #git #coding (youtube.com)