分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
關於GitFlow 分支策略的最初介紹,可以點連結參考
本篇的實作範例:連結
此實作範例,會有以下 Git 分支結構,一種適合多環境部署的 多環境分支策略
採用此 Git 多環境分支策略,有以下優缺點
項目 | 優點 | 缺點 |
---|---|---|
1. 結構清晰性 | - 分支分工明確,角色清晰,容易追蹤功能進展。 | - 分支數量多,學習曲線陡峭,對新手不友好。 |
- 易於定位問題和回溯歷史。 | ||
2. 風險管理 | - 隔離性高,功能逐步推進,減少直接影響生產的風險。 | - 多層次驗證可能導致流程延遲,增加開發時間。 |
- 支持緊急修復流程。 | ||
3. 並行開發支持 | - 支持多功能分支並行開發,互不影響。 | - 多人協作可能導致頻繁的合併衝突。 |
4. 歷史記錄 | - 提交歷史條理清晰,功能變更來源可追溯。 | - 頻繁的合併操作可能導致提交歷史變得冗長。 |
5. 支持 CI/CD | - 支持自動化測試與部署流程。 | - 初期工具配置和流程構建成本較高。 |
6. 效率與成本 | - 減少生產風險,增加穩定性。 | - 重複驗證和冗長的流程降低開發效率,尤其是小功能時成本不成比例。 |
7. 適用項目規模 | - 適合中大規模團隊和複雜項目。 | - 小型團隊和簡單項目中顯得過於複雜,可能不適用。 |
8. 工具依賴性 | - 與工具(如 Jenkins、GitHub Actions)結合可提升效率。 | - 手動操作管理分支需要高投入,無工具支持時成本很高。 |
9. 衝突管理 | - 定期同步減少合併衝突風險。 | - 多層級分支推進導致合併衝突風險增加,依賴開發者協作能力。 |
10. 測試與驗證流程 | - 確保每個環境的穩定性與可控性。 | - 重複測試容易導致人力和時間的浪費,需精準化測試策略。 |
11. 緊急修復處理 | - HotFix 分支可快速修復生產問題,並同步到其他環境。 | - 修復後的變更同步流程可能繁瑣,且易出現漏同步的問題。 |
採用 Git 多環境分支策略考量的點是專案規模的是否夠大,規模較大就很適合使用,便於所有開發統一管理,降低開發合作時的風險性,追朔歷史。
延伸到適用環境,列出以下對比
適用場合 | 不適用場合 |
---|---|
1. 中大型團隊(5 人以上)。 | - 分小型團隊(1~2 人)。 |
2. 多環境需求的複雜項目(如開發、測試、預生產、正式生產)。 | - 單一環境的簡單應用開發。 |
3. 功能多,並行開發需求高。 | - 短期項目或需求變更較少的項目。 |
4. 須追蹤歷史和功能來源的長期維護項目。 | - 對歷史追蹤要求不高的短期項目。 |
採用 GitFlow 多環境分支策略考量的點是專案規模的是否夠大,夠大就很適合使用,便於所有開發統一管理,降低開發合作時的風險性。
可以發現 Git 多環境分支策略是GitFlow 分支策略是延伸變化。
這邊要介紹以下 4 種合併方式 Rebase、Squash、Merge、CherryPick 在此多環境分支策略下,什麼時機點使用
分支 | 使用方式 | 情境描述 |
---|---|---|
Feature | Rebase, Squash | Feature 分支與 Dev 同步進展時使用 Rebase,完成後合併到 Dev 使用 Squash 簡化歷史。 |
Dev | Merge | 功能驗證完成後,合併到 QAT 分支,保留完整歷史記錄。 |
Qat | Merge, Cherry-Pick | 合併 Dev 的功能提交;緊急修復從 Dev 挑選變更直接應用到 QAT 進行驗證。 |
Stage | Merge, Cherry-Pick | 合併 QAT 的穩定提交;緊急修復需要挑選特定提交快速應用到 Stage。 |
Main | Merge, Cherry-Pick | 合併 Stage 的穩定提交;Cherry-Pick 應對緊急修復直接上線。 |
當開發者在 Feature 分支中工作時,Dev 分支可能有新的變更。
Rebase 可以將 Dev 分支的最新提交應用到 Feature 分支上,保持基線一致,減少未來的衝突。
以開發者的角度,當前有一個功能需要調整,我自己從我本地拉取 featureA 分支開發
並且開發完成簽入到我本地:
這時 Dev 可能因為某些原因,另一個工程師需要緊急修復,更新到 DEV 上
在我的分支推送前,開啟 Rebase
如圖,選擇 Dev 做 Rebase 來源,並且執行
這時可以發現 Feature A (我自己)的分支,歷史紀錄已經被補上 Dev 的簽入
因為最終 FeatureA 全部開發完成後會移除,但是在開發過程中,有 Rebase 可以確保我的開發都是包含正式的簽入
當開發者在 Feature 分支中工作時,可能不會一天開發完成,自己會多次簽入,因此影響範圍只有 FeatureA (自己)
例如,自己開發分三天完成,但是對於主分支,並不需要知道這些無用的 Commit Log(每個開發團隊定義不同,可能有些會希望保留開發的所有歷程)
這時,就需要在 Push 前,調整這些冗餘 Commit 紀錄
先開啟 Rebase 介面
我們只要保留最後的簽入,因此要選擇 ID:2 與 ID:3 的 Commit 做壓縮合併,將其設為 Squash
※右邊的 Force Rebase 要打勾
合併後,可以看到已經移除 ID:2 ID:3 只保留最後一筆,並且這是最終調整完成的代碼
關於 Merge、Cherry-Pick 可參考 0059. Git - GitFlow 分支策略下的合併方式 Merge 與 Cherry Pick
至此,多環境分支策略下,會常常使用的 4 種 Merge 方式已涵蓋。