到目前為止我們討論的是理想情況:你寫程式、做 commit、建立 Pull Request。但在現實中常常會出狀況:你可能在程式碼裡犯錯、用錯的訊息做了 commit,或只是發現自己朝錯誤方向走了。這堂課我們會聊常見的問題怎麼解決。
1. Rollback — 取消到 commit 之前的變更
場景:你修改了檔案,但發現所有修改都是錯的,想快速把檔案還原到上一次 commit 之後的狀態。
使用 Rollback 功能:
- 打開
Commit標籤。 - 在列表中找到你想要「回滾」的已修改檔案。
- 對它按右鍵然後選擇
Rollback。
IDE 會警告你變更會被丟失。確認後檔案會立刻回到 Git 中上一次保存的版本。這是取消本地變更最簡單也最安全的方法。
2. Reset — 刪除本地 commits
場景:你做了一個或多個 commit,但還沒做 push。你發現這些 commits 是錯的,想把它們完全刪掉,就像從來沒做過一樣。
使用 Reset 功能:
- 打開
Git -> Log標籤,查看 commit 歷史。 - 找到最後一個「好的」commit,也就是你想要回到的那個(在錯誤的 commits 之前)。
- 對它按右鍵,選擇
Reset Current Branch to Here...。
在打開的視窗會讓你選擇 reset 的模式。最激進的是 Hard。
注意! Hard 模式會不可逆地刪除所有在選中 commit 之後的 commits,以及那些 commits 中的程式碼變更。請非常小心地使用它,且只用在那些還沒被任何人看到(還沒 push 到 GitHub)的 commits 上。
3. Push 之後該怎麼辦?
場景:你做了 push,之後才發現裡面有錯誤。
一旦 commit 被推到遠端伺服器,它就成為專案公共歷史的一部分。試圖重寫這段歷史可能會給同事帶來大麻煩。想像一下他們已經把你的變更拉下來並在其上開始工作。
正確且安全的做法:
直接做一個新的 commit 去修正錯誤,然後推送它。這是完全正常的做法。這樣一來,歷史保持誠實且對所有人都清楚。
4. 回顧過去:進階的 log 使用
我們已經知道 Git -> Log 標籤,但它不僅僅是 commit 列表,而是一個強大的調查工具。
- Commit Hash(提交哈希):你應該在 log 裡看到那種由字母跟數字組成的字串,例如
a1b2c3d。這個 hash 是唯一的,用來精確指向專案歷史中的某一點。你很少需要手動使用它,但要知道它就是每個代碼「快照」的唯一標識。![]()
- 你可以根據 branch、author、日期甚至 commit message 中的字詞來過濾歷史。這能幫你快速找到誰在何時對某塊功能做過改動。
- 想找是哪個 commit 新增或刪除了一行特定的程式碼?在
Log視窗有一個搜尋欄,它不只搜尋訊息,還能搜尋變更內容本身。 - 在程式碼編輯器的行號區按右鍵,選擇
Annotate with Git Blame。IDE 會在每一行旁邊告訴你是誰以及在哪個 commit 最後改過它。這對理解為什麼程式碼要這樣寫非常有幫助。
5. 危險區:Force Push
所以我們已經確認改動已推送的 commits 是不好的做法。但如果你還是改寫了本地歷史(比如用 Reset),結果它和伺服器上的歷史不一致,當你嘗試正常 push 時 Git 會報錯,保護公共歷史不被覆蓋。
這種情況下有個選項叫做 — force push(強制推送)。這個命令告訴伺服器:「把你那邊的都忘了。我的本地歷史才是正確的。用我的歷史替換你那邊的。」
注意! 在 99% 的情況下,在團隊專案中使用 force push 是個 災難。它可能會不可逆地刪除你同事已經拉下來並基於此工作的 commits。這就像從大家共用的圖書中撕掉頁面然後黏上你自己的。
什麼情況絕對不能用 force push:
- 任何共享分支:
main、develop、master。絕對不行。 - 任何有其他人也在上面工作的分支。
唯一可接受的情境:
你在自己的私人 feature branch 上工作,沒有人看過也沒人用過。你做了幾個「髒」的 commits,推到伺服器後又想用 Reset 整理它們。這種情況下可以做 force push,把你在伺服器上的分支更新好,再去建立 Pull Request。
在 IDE 裡這個選項通常藏在 Push 按鈕後面。IDE 的開發者是故意這麼設計的,避免你不小心按到。
如果你沒有 100% 的把握自己在做什麼——就別用 force push。更安全的做法是做一個新的 commit 去修正問題。
6. 專案更新
在開始新任務前,務必在 main 分支上按一下 Update Project。這能避免很多未來的合併衝突,並確保你是從最新的程式碼開始工作的。

GO TO FULL VERSION