Hoàn tác thay đổi với restore và checkout
Undoing Changes with restore and checkout
Lỡ sửa nhầm một file, hay git add nhầm thứ không muốn commit? Git cho bạn nhiều cách để hoàn tác undo thay đổi chưa commit. Bài này tập trung vào git restore — lệnh hiện đại, rõ ràng — và đối chiếu với cú pháp checkout cũ.
git restore: bỏ thay đổi trong working directory
Khi bạn đã sửa một file nhưng chưa git add, và muốn vứt bỏ thay đổi để quay về như commit cuối:
# Khôi phục một file về trạng thái ở HEAD
git restore app.js
# Khôi phục toàn bộ file đang thay đổi
git restore .
Thao tác này phá hủy dữ liệu
git restore <file> xóa vĩnh viễn thay đổi chưa commit trong working directory — không có thùng rác để khôi phục. Chỉ dùng khi chắc chắn muốn vứt bỏ.
git restore --staged: gỡ khỏi staging (unstage)
Nếu bạn đã git add một file nhưng đổi ý, muốn gỡ nó khỏi staging area mà vẫn giữ nguyên nội dung đã sửa:
# Đưa file ra khỏi staging, giữ thay đổi trong working directory
git restore --staged app.js
Lệnh này chỉ dời thay đổi từ vùng staging về lại working directory — an toàn, không mất dữ liệu. Thường thấy gợi ý này trong output của git status.
Phân biệt hai chế độ restore
| Lệnh | Tác động | Nguy hiểm? |
|---|---|---|
git restore <file> | Bỏ thay đổi chưa stage (về HEAD) | Có — mất dữ liệu |
git restore --staged <file> | Unstage, giữ nội dung trong working dir | Không |
Muốn vừa unstage vừa bỏ luôn thay đổi, kết hợp cả hai: git restore --staged --worktree app.js.
git checkout -- file: cú pháp cũ
Trước khi git restore ra đời (Git 2.23), người ta dùng git checkout để bỏ thay đổi:
# Cú pháp cũ, tương đương git restore app.js
git checkout -- app.js
Dấu -- ngăn Git nhầm tên file với tên nhánh. Cú pháp này vẫn chạy được, nhưng git checkout bị quá tải — vừa chuyển nhánh, vừa bỏ thay đổi, vừa xem commit cũ — nên dễ gây nhầm lẫn. Git tách nó thành hai lệnh rõ nghĩa hơn: git restore (hoàn tác file) và git switch (chuyển nhánh).
Trọng tâm thi
git restore được giới thiệu để thay thế phần "hoàn tác file" của git checkout. Khi đề hỏi cách bỏ thay đổi chưa commit một cách rõ ràng, đáp án hiện đại là git restore, còn git checkout -- <file> là cách làm cũ tương đương.
Khi nào dùng cái nào
- Sửa nhầm, chưa add, muốn vứt bỏ →
git restore <file>. - Đã add nhầm, muốn rút lại nhưng giữ code →
git restore --staged <file>. - Trên hệ thống Git cũ hoặc tài liệu legacy → có thể gặp
git checkout -- <file>.
Mẹo
Luôn chạy git status trước. Nó cho biết file đang ở trạng thái nào (modified, staged) và thường gợi ý đúng lệnh restore cần dùng.
Tóm tắt
git restore <file>bỏ thay đổi chưa stage, đưa file về như ởHEAD(phá hủy dữ liệu).git restore --staged <file>gỡ file khỏi staging mà vẫn giữ nội dung (an toàn).git checkout -- <file>là cú pháp cũ tương đươnggit restore <file>.- Git tách
checkoutthànhrestore(hoàn tác file) vàswitch(chuyển nhánh) cho rõ nghĩa.