「總算是de完bug了...」我放心似的吐出這句話。改了兩三天結構,總算是領悟到為啥前輩都說程式能動就別管她。
微風徐徐的吹過髮際,螢幕右下角告知現在已是六月,剛下完雨的空氣顯得格外涼爽。有一部份是事實,當然要說是我事情做完的心理感受也不是沒道理。
7Please respect copyright.PENANA492e7oU5GE
說時遲那時快,Jenkins率先傳了一則訊息過來。這傢伙平常都待在remote,有事了去叫她起床,沒事她就待那邊伺候那邊的其他環境。我點開信件一看,心差點涼了半截。CI/CD崩潰,同時Node.js也徑直踹開房門,見我揪起領子劈頭就問:「500 Internal Server Error,from... env not found?!我真的是謝囉!環境變數死去哪了?」
7Please respect copyright.PENANAEwpgxOzcca
我愣了三秒,還來不及把外送剛到的奶茶端起來,JavaScript娘也氣呼呼衝了進來,裙擺還在飄,怒氣早已噴上天花板。
「你是不是改了.env檔沒說?我新build的版本一開進來就全白!header消失、按鈕全炸、console一片紅!」
我正想開口解釋,WordPress娘的聲音從隔壁棟Docker容器裡傳來,像是從地獄傳來的低吼:「MySQL無法連線...Sam,你是不是重構的時候動到了我config裡的host?我相信妳應該知道那不能動吧?」語音聽起來是溫柔的,但感覺好像我會沒命。
我結巴了一下:「我只是...想整理一下資料夾...」
Node.js 已經開始在地板上來回踱步,邊踱邊唸:「為什麼production config會跟dev混在一起?為什麼dotenv沒上.gitignore?為什麼我現在還要debug你昨天半夜commit的code?」她的語氣一句比一句加重,但我也沒資格回懟。
Java娘也悄悄走進來,低頭看了看console log,沒說話,只是端起咖啡輕輕嘆了口氣:「怎麼每次出事,都是你們那群scripting語言先動的手?」總覺得咖啡快被她喝完了,但她又很挑咖啡品種。哪像我,一杯奶茶就能收工。
事情還不是最糟的。Jenkins隔著網路頻寬硬是插進來,語音抖著說:「請、請問有人可以restart一下pipeline嗎?我已經連不上runner了...」身為CI/CD工具,Jenkins給我的印象一直都是沉穩的大姊姊,沒想到這波還真是給我腦子玩到當機了。
7Please respect copyright.PENANAmAi6qsZfUY
我站在這風暴中心,握著奶茶,早已退冰了。
Node.js娘抱著她的log,一臉陰沉地坐在我桌角:「你現在要怎麼收場?」
我嘆了口氣,終於鼓起勇氣,打開Powershell,鍵盤啪啪作響,打下了一段話:git reset --hard HEAD~1
「好啦,可以放鬆了,各位,沒事啦...」「甲賽啦...沒事?沒妳個大頭鬼沒事。」Git把一段話砸在我臉上,fatal: unable to resolve 'HEAD~1': unknown revision or path not in the working tree.
我眼前一黑,滑鼠差點砸向螢幕。
「哇~你連commit都沒commit,就跑去reset?你好歹也讓我知道有沒有東西能回滾好嗎?」Git娘從天而降,雙手一攤,肩膀上的小徽章「merge」與「rebase」閃著無情的光芒,彷彿在嘲笑我的智障舉動般。
「你昨天做的那個 amend……直接蓋掉你前一次 commit 了啊笨蛋。」她把泡茶的姿勢收起來,一臉失望,「你根本把HEAD掉到沼澤裡,現在這專案歷史整段斷了,懂?」「好了,徹底沒救,建議你趁還有印象時重寫一遍,這次別耍白癡了。」
7Please respect copyright.PENANAh9rt85Tic2
「不對,這還有救。」Git聽到這句話,驀然回首,那人沒在燈火闌珊處,她坐在電腦前,隨著鍵盤聲出現在Powershell裡的是git reflog的指令。
畫面出現熟悉的紀錄:
c4f3e1d HEAD@{0}: commit (amend): fix everything once and for all7Please respect copyright.PENANAtSiz6WaA7y
12a3b2c HEAD@{1}: commit: initial setup
我指著第二行:「就是這個。」
git reset --hard 12a3b2c
隨著Enter敲下去的瞬間,是時間暫停的緊張。
「啊勒這下可真好,啥都沒了,重來?」耳畔傳來Node幸災樂禍的語音。「妳可別小看了不想重肝一遍的開源貢獻者的實力啊...你覺得我會沒備份嗎?」
接著,我輕輕點開GitHub,切到feature/recovery-dump分支,一行bash悄悄貼上:git cherry-pick 345def7
那是一個我昨晚偷偷推上去的暫存分支備份-雖然commit message寫的是temp pls dont look。
7Please respect copyright.PENANAhGsbRS2MGz
全場再度沉默,然後爆出歡呼。
WP娘:「資料庫恢復連線了!」Node.js娘:「API起來了,logs clear!」JS娘:「UI 顯示正常,Component有救!」Copilot:「我就知道你會用那個commit,我幫你補了missing import。」
隨著Jenkins一句「Pipeline成功,部署完成。」,Git娘這才收起她的冷笑:「這次勉強給你過關。」
7Please respect copyright.PENANAs7lMWc7lRV
我癱坐在椅子上,耳機裡的瑞克搖剛好唱到Never gonna give you up~(作者:恭喜各位被我搖了)
六月的風,輕輕吹過髮梢。7Please respect copyright.PENANA5osoUM5c8g
我看著螢幕上閃爍的綠色小勾勾,默默地在心裡說:
「……還是別 .env好了。」
7Please respect copyright.PENANABz0Fa0GHj9
註解
git reset --hard HEAD~1:這行指令會把目前的 Git 狀態回到上一個commit,且會直接丟掉所有尚未提交的變更,非常危險。7Please respect copyright.PENANAYdIRFvbGDQ
fatal: unable to resolve 'HEAD~1':當Git找不到上一個commit(例如目前還沒有commit)時,會出現這個錯誤。7Please respect copyright.PENANApslm8zfqXM
amend:指git commit --amend,是用來修改上一次commit的指令,會覆蓋掉原本的commit訊息或內容。7Please respect copyright.PENANA6ii5EU5bt8
git reflog:這個指令可以顯示最近所有HEAD的移動記錄,是救援誤操作的神器。7Please respect copyright.PENANA7qKofKJsTF
git cherry-pick:可以把指定commit套用到當前分支,適合從備份分支挑特定改動過來。7Please respect copyright.PENANArFi9pAWFqI
temp pls dont look:一個經典的懶人備份commit message,但千萬不要在production用這種訊息!7Please respect copyright.PENANAxJuMOGUQat
.env:大部分專案中用來存放環境變數的設定檔,包含資料庫密碼、API金鑰等敏感資訊,應妥善管理。
7Please respect copyright.PENANAFwLUlZdVrr
作者後記