Git
develop 已經混了多個 feature,但你只想「挑一個上線」。
先講結論:不要從 develop 直接 merge 到 main,而是要用「release / hotfix / cherry-pick」策略做隔離。
問題本質
feature/A → develop
feature/B → develop
結果:develop = A + B
但你想:main = A(不要 B)
這時候 develop → main 會把 B 一起帶上去,這是正常行為。
解法一(最推薦):建立 Release Branch(正統 Git Flow)
做法
從 develop 切一條 release,但「只包含你要的內容」
關鍵:你要在「A完成時」就切 release,不要等B也進來
feature/A → develop
↓
從 develop 切 release/1.0(此時只有 A)
之後:
feature/B → develop(繼續開發)
最後:
release/1.0 → main(只會有 A)
優點
- 乾淨、符合團隊流程
- 測試環境 = release branch(不是 develop)
- develop 可以繼續亂長(沒差)
缺點
- 需要流程紀律(不能亂 merge 時機)
解法二:Cherry-pick(補救用)
如果你已經來不及了(A + B 都在 develop)
可以這樣做:main ← cherry-pick A 的 commit
指令:
git checkout main
git cherry-pick <A的commit>
優點
- 快速救火
- 不用改流程
缺點(很重要)
- commit 會 duplicate
- 未來 merge 可能衝突爆炸
- 不適合長期用
只建議「偶爾用」
解法三:Feature Toggle(進階架構)
就算 B 已經進 main,也「不要讓它生效」
例如:
if (FeatureToggle.IsEnabled("FeatureB"))
{
// B功能
}
優點
- 可以持續部署(CI/CD 最愛)
- main 永遠是可上線版本
缺點
- 需要工程能力 + 管理 toggle
- 程式會變複雜
給你一個實務建議(很重要)
你現在的流程:
feature → develop → main
其實會有一個常見問題:
❌ develop 變成「垃圾場」(一堆還不能上的東西)
建議優化流程(簡化版 Git Flow)
方式一(推薦你現在團隊)
feature → develop(整合)
develop → release(測試)
release → main(上線)
重點:
- 測試環境用 release,不是 develop
- develop 不等於「可上線」
方式二(更進階,適合高手)
Trunk-Based Development
feature → main(小步提交 + feature toggle)
不再有 develop
總結(直接講答案)
你這題最佳解:
✅ 建立 release branch(在A完成時切)
❌ 不要從 develop 直接上 main
⚠️ 已經混了就用 cherry-pick 救
元哥的筆記