Coolkid mascot CoolkidLab Build in Public. Level up together.
首頁新手教學免費工具AI 新聞GitHub 精選陪跑服務關於

新手教學 · 疑難排解

改好推上去,網站卻沒更新?部署失敗這樣查

閱讀
摘要

短答給趕時間的人:「推送成功」跟「上線成功」是兩件事。推送只是把檔案交出去,後面還有一段自動建置。建置失敗的話,網站會一直停在最後一次成功的舊版,而且多半不會有人通知你。排查三步:第一,看線上頁面的實際內容與更新時間,確認是不是真的舊版。第二,開一份乾淨的專案副本重跑建置,你本機會過、乾淨副本會出錯,那就是「檔案在本機、沒進 git」,git 就是程式檔案的版本紀錄庫。第三,查最近誰改過共用的資料檔,壞的常常不是你這筆。

這篇是一次真實事故的重演。

2026 年 7 月 23 日晚上,我更新了一篇文章、推送上去、畫面也顯示成功,結果網站上什麼都沒變。

因為當天下午另一次改動漏交了一個檔案,從那之後每一次自動建置都在失敗。

整個網站停在舊版好幾個小時,包括我晚上推的東西,全部被連坐。

從發現「怎麼沒變」到修好上線,整段排查大約 20 分鐘。

這篇把那 20 分鐘拆成你可以照抄的順序。

事故現場:推送都成功,網站全舊版

先講一次事發的經過。

我的網站是「推送到 git,雲端自動重新建置上線」這種架構,跑在 上面,免費方案就已經有這個功能。

當天下午,一次改動在文章裡引用了一個新的詞條。

但詞條定義那個檔案只存在本機,忘了一起交進 git。

本機看一切正常,雲端拿到的專案卻缺了一塊,建置直接報錯停止。

重點是接下來這件事。

建置失敗的時候,網站不會壞掉、不會白畫面,只是安靜地繼續供應最後一次成功的舊版。

訪客看不出異狀,我也看不出異狀,推送照樣顯示成功,從下午到深夜,中間推的所有更新全部沒有上線。

而且沒有任何一個畫面主動告訴我這件事。

這就是「靜默失敗」:機器沒有出聲,你就以為一切健康。

可怕的地方在哪?你連要去查都想不到。

排查三步:網站沒更新該從哪裡查起?

  1. 第 1 步:確認線上到底是哪一版。別只按重新整理,直接看頁面上的「最後更新」日期,或者搜尋一段你新加的文字在不在。瀏覽器會騙人,先用無痕視窗把快取排除掉。還在舊版,才是真的沒上線。
  2. 第 2 步:開一份乾淨副本重跑建置。把專案從 git 重新取出一份,要乾淨的資料夾,不是你平常工作的那份,然後在裡面跑一次建置。你工作的那份會過、乾淨那份會出錯,答案就出來了:有檔案只存在你電腦,沒進 git。錯誤訊息會直接指出缺什麼。
  3. 第 3 步:查最近的共用改動。如果乾淨副本也能過,回頭看平台的紀錄,哪次建置開始失敗、錯在哪一行。多人或多對話協作的時候,特別注意「別人最近改了什麼共用檔案」。建置是整包一起做的,前面有一筆壞的,你後面推的全部連坐。

我當天的實際路徑,就是下面這三步。

第 1 步先確認真的沒上線。線上頁面的「最後更新」還停在舊日期嗎?

第 2 步定位:乾淨副本重跑,第一次就跳出「查無詞條」的錯誤。

第 3 步歸因:一看就是下午那筆改動引用了新詞條,而定義檔沒有進 git,所以雲端那邊拿到的專案就缺了一塊。

補交那個檔案,推送,幾分鐘後全部更新一起上線。

兩個機制教訓:失敗了,為什麼沒人看見?

第一個教訓有點反直覺:建置報錯停止,為什麼反而是「對的設計」?

我的建置系統遇到「文章引用了不存在的詞條」會直接罷工,而不是裝作沒事,出一個缺了一塊的網站給訪客看到。

這叫 fail-fast,中文可以說成快速失敗:錯誤在第一關就大聲報錯,好過安靜地流到訪客面前。

這次事故裡,建置系統做對了自己的工作,把有問題的版本擋在門外。

真正的洞在第二個環節:失敗了,但沒人看見。

部署平台其實會記錄失敗,有的也會寄信。

但那些訊息常常不在你第一時間會看的地方,於是「大聲失敗」就變成「在沒人的房間裡大聲失敗」,等於根本沒失敗。

這個洞要怎麼補起來?修法其實很便宜。

把部署平台的失敗通知打開,寄到信箱或者通訊軟體都行。

或者養成「推完重要更新,30 秒後開無痕視窗看一眼線上頁」的習慣。

我自己是兩個都做,再加一條規矩:凡是「推送成功」的回報,一律附上線上驗證的證據,不拿推送當上線。

口訣:推送成功 ≠ 上線成功。系統要大聲失敗,失敗要有人看見,兩個缺一個,都是靜默失敗。

三個坑,加一個起手式

  1. 「我本機是好的」所以不信建置壞了。本機恰恰是最不可信的證人,你桌上什麼檔案都有,雲端只有 git 裡的東西。乾淨副本才是跟雲端同一個世界。
  2. 只查自己這筆改動。建置失敗會連坐,你的改動可能完全沒問題,壞的是幾小時前另一筆。往前翻,別對著自己的改動鑽牛角尖。
  3. 改共用資料檔不一起交。這次的根因就是這個,文章與詞條定義分屬兩個檔案,引用進了 git、定義留在本機。教訓是一個改動牽到幾個檔案,就一起交,別分批。

新手的起手式只要 30 秒就做完。

現在就去你的部署平台把「失敗通知」打開,Vercel 在專案設定的 Notifications 裡,免費方案就有。

這大概是本篇價值最高的 30 秒。

然後記住那句口訣,下次網站「怎麼沒變」的時候,照三步走,不用慌。

推送成功不等於上線成功。自動部署的建置失敗是安靜的,網站不會壞,只是一直停在最後一次成功的舊版,訪客與你都看不出異狀。真實事故發生在 2026-07-23,一筆改動引用了新詞條但定義檔沒進 git,之後每次建置全部失敗,所有更新連坐好幾個小時。排查三步:第一,看線上頁的「最後更新」與新內容在不在,先用無痕視窗排除瀏覽器快取。第二,乾淨副本重跑建置,本機會過、乾淨副本會出錯,就是檔案沒進 git。第三,查最近的共用改動,壞的可能不是你這筆。機制教訓是 fail-fast 報錯停止是對的設計,但「大聲失敗」要配上「有人看見」,所以去部署平台把失敗通知打開,推完重要更新用無痕視窗驗一眼線上頁,不拿推送當上線。

名詞解釋

部署(deploy)
把做好的網站或程式「推上線」讓所有人用得到的動作。
Vercel
把網站免費發佈到網路上的服務:接上 GitHub 後,每次推程式碼就自動更新網站,個人專案免費方案就夠用。
Git
程式碼的版本紀錄系統:每次改動存成一個「存檔點」(commit),隨時可以回溯、比對、還原,不怕改壞。
提交(commit)
Git 的一個存檔點:把這次改動連同一句說明記錄下來,之後隨時可以回到這個版本。
快取(cache)
把載過的資源暫存起來,下次直接用、不重新下載。網站變快的最便宜手段之一。

全站名詞表 · 161 條 →

不想錯過 Lab 的新文章?
訂閱後有新文章上線,就寄信通知你,
點有興趣的進來看就好。

填 email 就完成訂閱(信由 Substack 代寄)、隨時取消、不轉賣 email。

如果內容對你有用就太好了
隨喜斗內

Buy Me a Coffee at ko-fi.com
NEXT CHAPTER ▸ Vercel 部署還是舊版?我以為很快,改了 3 小時

▸ 常見問題

推送成功了,為什麼網站還是舊的?

「推送」只是把檔案交給 git,後面還有一段自動建置與部署。建置失敗的話,網站會繼續供應最後一次成功的舊版,而且預設多半不會通知你。先用無痕視窗排除瀏覽器快取,再看頁面上的「最後更新」日期。真是舊版,就去部署平台看建置紀錄,通常會看到紅色的失敗。

本機跑起來明明是好的,為什麼雲端建置會失敗?

因為本機和雲端拿到的專案不一樣:你桌上什麼檔案都有,雲端只拿得到 git 裡的東西。最常見的原因就是「有檔案改了但沒交進 git」。驗證方法是把專案從 git 重新取出一份乾淨副本,在裡面跑建置,乾淨副本出錯的那個訊息,就是雲端看到的錯誤。

怎麼第一時間知道部署失敗?

把部署平台的失敗通知打開。Vercel 這類服務在專案設定的 Notifications 裡就有,免費方案可用,可以寄信或者接通訊軟體。再配一個便宜的習慣:推完重要更新,30 秒後開無痕視窗看一眼線上頁面。兩層都有,靜默失敗就變成大聲失敗。

我的改動沒問題,也會被別人的失敗影響嗎?

會,這叫連坐。自動建置是整包專案一起做的,只要有一筆改動讓建置失敗,之後所有更新都上不了線,直到那筆被修好。所以排查的時候別只盯著自己的改動,看建置紀錄「從哪一次開始失敗」,那一次才是根因。

看完這篇之前先確認:

適合你
  • 改好也推上去了,網站卻一直是舊版的人
  • 用 Vercel 這類「推送自動部署」服務的人
  • 想學一套 10 分鐘定位「為什麼沒上線」的排查順序
不適合
  • 還沒把網站放上線 (先看部署那篇)
  • 頁面有更新只是樣式跑版 (那是另一類問題)
  • 沒在用自動部署、手動上傳檔案的人

← 回新手教學 · 看「出錯看這裡」這個主題

⚠ 本站所有內容僅供教育與研究用途,不構成投資建議,不保證任何獲利。投資有風險,使用者須自行判斷並承擔結果。
TAO 道 · Hikari Zen YouTube ↗
音樂透過 YouTube 播放
♪ TAO 道 · Hikari Zen — Japanese Zen Music(YouTube)