核心原則

退出指令(「先還原」「先重來」「先放著」)的執行前要先確認兩件事:還原到哪個狀態、要不要先存 checkpoint。 直接刪掉當前進度、未來想比較沒得比、想恢復也找不到。


為什麼退出指令需要 protocol

商業邏輯

退出指令的字面意思是「拿掉現在做的東西」、但背後通常有更複雜的意圖:

字面可能的真實意圖
「先還原」暫時不用、之後可能重做
「先還原」完全放棄、不會再做
「先還原」換個方向重做
「先重來」從上一個 commit 重新試
「先重來」從更早的點重新試

執行者不確認意圖、直接刪 = 把使用者的選項收窄成「沒有了」。事先確認 = 為使用者保留可能性。


這次任務的實際情境

觀察

使用者說:「如果要做到這麼大的複寫原設計、我們先還原回去、先不要做這個變更」。

我立刻刪掉那段 CSS、繼續往下做其他事。沒問「還原到哪」、沒先 commit checkpoint。

判讀

後來想比較「複雜覆寫版本」與「接受原設計版本」的差異 — 沒得比。「複雜覆寫版本」已經不存在於 git 歷史。

正確流程應該是:

  1. 收到「還原」指令時、先回應「我會先 commit 當前進度(即使未採用)作為 checkpoint,再還原到 X 狀態。OK 嗎?」
  2. 確認後、commit 當前狀態(不 push)、commit message 標明「探索版本、未採用」
  3. 還原到 X 狀態
  4. 繼續做後續事

未來想比較或恢復、checkpoint 都還在。

執行:退出指令的 protocol

收到退出指令時、依序處理:

步驟動作
1暫停執行、不要立刻刪
2確認「還原到哪個狀態」(上個 commit / 特定 commit / 完全乾淨)
3評估「當前進度有保留價值嗎」 — 探索成果、未採用方案、可能未來重用
4有保留價值 → 先 commit checkpoint、message 標明「探索、未採用」
5執行還原(reset / checkout / revert)
6確認還原後狀態符合使用者意圖

Checkpoint 的命名與 commit message

當前進度作為 checkpoint commit、message 應該包含:

1chore(explore): N+1 attempts to remove disclosure marker
2
3探索方向:用 ::-webkit-details-marker / ::marker / display: block 三層
4覆寫移除 disclosure 三角圖示。
5寫了 5 條 CSS 跨 3 種瀏覽器、覆寫成本過高。
6
7最終決定:接受原設計、不採用此方向。
8此 commit 保留探索成果、未來若評估值得做時可參考。

關鍵元素:

  • chore(explore): prefix — 標明非正式採用
  • 探索方向 — 說明做了什麼
  • 最終決定 — 為什麼不採用
  • 保留理由 — 未來何時可能重用

未來人看到這個 commit、知道「這是探索、不是當前實作」、不會誤用。


內在屬性比較:四種退出處理

處理可逆性比較成本適用情境
直接刪、不留紀錄最低 — 永久失去不可比較不適用
git reset --hard(未 commit 直接丟)低 — git reflog 短期還在困難確定不要
git stash(暫存到 stash)中 — stash 可隨時恢復短期暫停
git commit checkpoint 後 reset / revert高 — commit 永久存在容易探索性嘗試、未採用方案

優先選 checkpoint 方式 — 為未來保留比較與恢復的可能性。


退出意圖的辨識

從語氣判斷

語氣對應意圖推薦處理
「先還原」暫時、可能重做Checkpoint + 還原
「先還原、不要做了」確定放棄Checkpoint(小機率重看) + 還原
「重來」換個方向Checkpoint + 還原到起點
「不要這樣寫」局部修正、不是全還原局部改、不要全還原

不確定就問。「不要這樣寫」這類指令容易被理解成「全還原」、實際只是「這段重寫」。

確認意圖的問法

1你想要:
2  □ 完全還原、刪掉這次的 CSS
3  □ 還原但保留 commit checkpoint、未來可能參考
4  □ 局部修正(哪一段保留、哪一段重寫)
5
6或是其他?

設計取捨:退出指令的處理策略

四種做法、各自機會成本不同。這個專案選 A(Checkpoint + 確認還原範圍)當預設、其他做法在特定情境合理。

A:Commit checkpoint + 確認還原範圍(這個專案的預設)

  • 機制:commit 當前進度(標明「探索、未採用」)+ 問「還原到哪個 commit」+ 執行還原
  • 選 A 的理由:未來想比較或恢復都還在、checkpoint 成本只是多一個 commit
  • 適合:探索性嘗試、未採用方案的退出
  • 代價:多一個 commit 在歷史中(可後續 squash 或保留)

B:git stash 暫存

  • 機制:把未 commit 的變更存到 stash、不污染 commit 歷史
  • 跟 A 的取捨:B 不留 commit、A 留 commit;B 適合「短期暫停、之後恢復」、A 適合「長期探索紀錄」
  • B 比 A 好的情境:暫時切到別的工作、之後一定會回來繼續

C:git reset --hard(直接丟)

  • 機制:reset 到指定 commit、未 commit 的變更全失去
  • 跟 A 的取捨:C 完全清乾淨、A 保留紀錄;C 在 git reflog 內短期還能恢復、但之後永久消失
  • C 才合理的情境:確定不要的探索、且確認不需要未來參考

D:直接刪檔案、不留 git 紀錄

  • 機制:手動刪 / 改、不 commit
  • 成本特別高的原因:未來想比較或恢復都做不到、使用者選項被收窄
  • D 是反模式:git 是免費的紀錄工具、不用反而是浪費 — 未來想比較或恢復都做不到、使用者選項被收窄

判讀徵兆

訊號應該觸發的處理第一個該做的事
「先還原」確認還原範圍 + checkpoint問「還原到哪」
「重來」確認重做起點 + checkpoint問「從哪重來」
「不要做了」評估保留價值探索成本高就 checkpoint、否則直接刪
「先放著」Stash 或 branch 保留不要刪、要留可恢復路徑
「換個方法試試」Checkpoint + 換方向保留現方法的進度

核心原則:退出指令的執行不該收窄使用者的未來選項。Checkpoint = 給未來保留可能性、成本只是多一個 commit。