昨天商品頁還能顯示價格,今天一更新就只剩空白。若測試站能穩定重現,先找出一個價格正常的舊提交,以及一個確定出錯的新提交。git bisect 會在兩者之間挑出下一個要測的版本,讓你不用逐筆翻提交紀錄。
先把「正常」定義成一個可重做的檢查
以商品頁為例,每次用相同的測試商品、相同的資料和相同的啟動方式,只檢查價格欄是否顯示。先在兩端各做一次。若舊版也偶爾失敗,先排除快取、測試資料或外部服務的不穩定,再標記提交。
用乾淨的本機副本或測試工作目錄。搜尋期間 Git 會切換檔案版本,每次都應重新啟動或重建你要測的程式,避免一直測到上一版的產物。
讓 Git 選出下一個版本
下例的 v1.4.0 是已測過的正常標籤,HEAD 是現在已重現問題的提交。換成你自己的正常標籤或提交雜湊。
git status --short
git bisect start
git bisect bad HEAD
git bisect good v1.4.0
Git 切到候選提交後,用同一筆商品重測。價格空白就執行 git bisect bad,價格正常就執行 git bisect good。每標記一次,Git 會縮小範圍並挑下一個版本。若某版因依賴裝不起來而根本無法驗證,執行 git bisect skip。跳過的提交若剛好在故障邊界附近,最後可能只能列出數個候選。
記下第一個壞提交,再回到原本的版本
看到 first bad commit 後,把輸出的雜湊貼到下一段的第一行,查看改動。接著退出搜尋,讓 Git 回到開始前的分支或提交。
git show BAD_COMMIT_HASH
git bisect log
git bisect reset
這個結果回答的是「依這次判定,哪個提交先出現故障」。如果那次提交同時改了價格模板和資料格式,仍要看差異,並在相同測試環境重驗候選提交及其上一個正常版本,才能縮小到具體改動。
同一個檢查能用程式執行時
若已經有可靠的檢查腳本,可以在設定好兩端後執行 git bisect run。把腳本放在搜尋範圍之外,例如測試副本旁邊,以免切到舊提交時腳本不見。
git bisect run bash ../check-price.sh
腳本應在價格正確時回傳 0,確認價格空白時回傳 1。如果測試環境有問題,當前版本無法判斷,就回傳 125 讓 Git 跳過。留意指令不存在通常會回傳 127,Git 會把它判成壞版本。先手動在已知的兩端跑腳本,看它是否真的能分辨這兩種結果。
封面為 AI 生成的提交時間線插畫。
