Contents

git還原commit時候檔案狀態

在開發過程中,常常需要還原某個檔案或整個 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(不改歷史)