在開發過程中,常常需要還原某個檔案或整個 commit 的狀態。Git 提供多種方式來處理,了解它們的差異非常重要。
還原特定檔案到某個 commit 的狀態
使用 git checkout(舊版寫法)
1
|
git checkout <commit-hash> -- path/to/file.txt
|
這個指令會將指定檔案還原成特定 commit 的版本,並放到 Staging Area(暫存區)。
使用 git restore(Git 2.23+ 推薦寫法)
1
2
3
4
5
6
7
8
|
# 還原工作目錄中的修改(丟棄未暫存的變更)
git restore path/to/file.txt
# 還原到特定 commit 的版本
git restore --source=<commit-hash> path/to/file.txt
# 還原 Staging Area 中的檔案
git restore --staged path/to/file.txt
|
git restore 是 Git 2.23 之後引入的新指令,語意更清晰,建議優先使用。
git reset 三種模式
git reset 用來移動 HEAD 指標,改變 commit 歷史的位置,有三種模式:
1. --soft
1
|
git reset --soft <commit-hash>
|
- HEAD 移動到指定 commit
- Staging Area 保留變更(檔案回到
git add 之後的狀態)
- 工作目錄不變
- 適合用於:修改最後一次 commit 的內容,或合併多個 commit
2. --mixed(預設模式)
1
2
3
|
git reset --mixed <commit-hash>
# 或
git reset <commit-hash>
|
- HEAD 移動到指定 commit
- Staging Area 清空,變更退回工作目錄
- 工作目錄不變
- 適合用於:取消
git add 的動作,重新整理要提交的內容
3. --hard
1
|
git reset --hard <commit-hash>
|
- HEAD 移動到指定 commit
- Staging Area 清空
- 工作目錄也一併還原,所有變更都會丟失
- 適合用於:完全放棄某些 commit,回到乾淨的狀態
- ⚠️ 注意:此操作不可逆,請謹慎使用
常用範例
1
2
3
4
5
|
# 取消最後一次 commit,但保留變更在工作目錄
git reset HEAD~1
# 完全丟棄最後兩個 commit
git reset --hard HEAD~2
|
git revert:安全地撤銷 commit
1
|
git revert <commit-hash>
|
git revert 不會修改歷史,而是建立一個新的 commit 來「反向操作」指定的 commit。這是在公開分支上撤銷變更的推薦做法。
git reset vs git revert 比較
| 特性 |
git reset |
git revert |
| 修改歷史 |
是 |
否 |
| 適合公開分支 |
否 |
是 |
| 建立新 commit |
否 |
是 |
| 可指定還原範圍 |
是(HEAD 移動) |
是(特定 commit) |
小結
- 還原單一檔案 → 使用
git restore --source=<hash>
- 撤銷 commit 但保留變更 → 使用
git reset --soft 或 --mixed
- 完全丟棄 commit → 使用
git reset --hard(本地分支)
- 公開分支撤銷 → 使用
git revert(不改歷史)