Git在測試機當中遇到如果只挑一個上線,該怎麼做?

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 救

元哥的筆記