類別:DevOps 工具
| 發布於 2025-06-25 21:11
Git reset 與 revert 還原更動
git reset
將 HEAD 指向其他 commit
Git 提供三種 reset 模式,可根據不同需求還原專案狀態:
| 區域名稱 |
說明 |
| HEAD |
目前指向的 commit |
| Staging Area |
暫存區,下一次 commit 的候選更動 |
| Working Directory |
實際檔案,開發者正在編輯的地方 |
運作原理與模式比較
--soft
- 僅移動
HEAD 指向,不影響暫存區與工作目錄
- 適合重組 commit,例如合併多個 commit
--mixed(預設)
- 移動
HEAD,並將暫存區還原為指定 commit 的狀態
- 工作目錄不變,會顯示為未暫存變更(unstaged changes)
--hard
- 同步
HEAD、暫存區、工作目錄為指定 commit 狀態
- 所有未儲存變更將永久刪除,無法復原
使用情境與範例
清除最近的 commit(未 push)
- 撤回上一次 commit,保留變更,可修改後重新 commit(常與
--amend 一起使用)
清除暫存,但保留變更
- 取消所有
git add 的檔案,但保留檔案修改
- 適合取消加入過多的暫存檔案
完全回復為某個 commit 狀態
- 所有未儲存變更將刪除,僅保留指定 commit 狀態
注意事項
--hard 模式會永久刪除工作目錄與暫存區內容,無法復原
reset 會改變 Git 歷史,已推送的 commit 不應
reset,以免造成版本衝突
- HEAD 被移動後,可能會搞不清楚目前所在 commit,需謹慎操作
git revert
核心概念
git revert 會 建立一個新的 commit,內容為指定 commit
的反向更動:
- 不會刪除或撤銷原始 commit
- 是「反向提交」而非「刪除提交」
推送到遠端的情況
- 不應使用
reset 變更歷史,否則其他協作者會產生衝突
- 使用
revert 為非破壞性方式,可安全還原特定更動
多人協作情境
- 為維護穩定共用歷史,應避免使用 reset
revert 是安全且可追蹤的方式,適合多人協作流程
使用情境
還原錯誤功能
- 某功能上線後發現 bug,可
revert 該功能的 commit
- 修復完成後再重新提交
還原特定 commit 的影響
工作原理
假設 Git 歷史如下:
發現 C 有問題:
Git 會產生一個新的 commit E:
其中 E 的內容為 C 的反向操作
注意事項
| 情況 |
說明 |
| 衝突發生 |
如果目標 commit 與目前狀態衝突(尤其是 revert merge commit),會產生
conflict,需要手動解決 |
| 重複 revert |
不應重複還原同一個 commit,否則會反覆新增正負變化,造成混亂 |
| 還原合併 commit |
必須使用 --mainline,語意不易理解,也容易出錯 |
| 歷史雜亂 |
太多 revert 會讓 Git 歷史難以閱讀,建議搭配明確 commit message 解釋原因 |
Git reset 與 revert 還原更動
git reset
將 HEAD 指向其他 commit
Git 提供三種
reset模式,可根據不同需求還原專案狀態:commit的候選更動運作原理與模式比較
--softHEAD指向,不影響暫存區與工作目錄--mixed(預設)HEAD,並將暫存區還原為指定 commit 的狀態--hardHEAD、暫存區、工作目錄為指定 commit 狀態使用情境與範例
清除最近的 commit(未 push)
--amend一起使用)清除暫存,但保留變更
git add的檔案,但保留檔案修改完全回復為某個 commit 狀態
注意事項
--hard模式會永久刪除工作目錄與暫存區內容,無法復原reset會改變 Git 歷史,已推送的 commit 不應 reset,以免造成版本衝突git revert
核心概念
git revert會 建立一個新的 commit,內容為指定 commit 的反向更動:推送到遠端的情況
reset變更歷史,否則其他協作者會產生衝突revert為非破壞性方式,可安全還原特定更動多人協作情境
revert是安全且可追蹤的方式,適合多人協作流程使用情境
還原錯誤功能
revert該功能的 commit還原特定 commit 的影響
工作原理
假設 Git 歷史如下:
發現 C 有問題:
Git 會產生一個新的 commit E:
其中 E 的內容為 C 的反向操作
注意事項
revert merge commit),會產生 conflict,需要手動解決--mainline,語意不易理解,也容易出錯