Skip to content

3. Reset & Revert (The Undo Button)

IMPORTANT

CRUCIAL DISTINCTION:

  • Reset: Cỗ máy thời gian (Quay lại quá khứ, xóa bỏ tương lai). -> Nguy hiểm.
  • Revert: Tạo một commit mới để hủy bỏ tác dụng của commit cũ. -> An toàn.

3.1 Git Reset (Dùng cho Local Branch)

Bạn lỡ commit một đống rác rưởi? Bạn muốn quay lại thời điểm trước khi commit?

bash
git reset --soft HEAD~1
  • Soft: Hủy commit gần nhất, nhưng giữ code lại trong Staging Area. (An toàn nhất để sửa lại commit).
bash
git reset --hard HEAD~1
  • Hard: Hủy commit, xóa sạch code về trạng thái cũ. (Nguy hiểm tột độ - Code chưa lưu sẽ mất vĩnh viễn).

CAUTION

KHÔNG BAO GIỜ git reset trên branch đã Push lên Server (Shared Branch). Bạn sẽ gây ra thảm họa "Non-forward fast" cho đồng đội.


3.2 Git Revert (Dùng cho Shared Branch)

Bạn đã push code lỗi lên main. Bạn không thể reset (vì sẽ làm lệch lịch sử của team). Cách duy nhất là "thừa nhận sai lầm" bằng một commit mới.

bash
git revert <bad-commit-hash>

Git sẽ tạo ra một commit mới có nội dung ngược lại hoàn toàn với commit cũ (Thêm thành xóa, xóa thành thêm). Lịch sử sẽ trông như sau:

  1. feat: add login (Lỗi)
  2. revert: feat: add login (Sửa sai)

-> An toàn tuyệt đối cho team.

🧠 Quiz

Câu 1: Khi đã push code lỗi lên main (shared branch), nên dùng lệnh nào để sửa?

  • [ ] A) git reset --hard HEAD~1 rồi force push
  • [x] B) git revert <bad-commit-hash> để tạo commit ngược lại
  • [ ] C) git checkout <bad-commit-hash> rồi xóa file
  • [ ] D) Xóa branch main và tạo lại

💡 Giải thích: Trên shared branch, KHÔNG BAO GIỜ dùng reset vì sẽ viết lại lịch sử và gây lệch cho team. git revert tạo commit mới đảo ngược thay đổi, an toàn tuyệt đối vì giữ nguyên lịch sử.

Câu 2: Sự khác biệt giữa git reset --soft, --mixed--hard là gì?

  • [ ] A) Chúng chỉ khác nhau về tốc độ thực thi
  • [ ] B) --soft xóa file, --mixed giữ file, --hard backup file
  • [x] C) --soft giữ staging + working dir, --mixed giữ working dir, --hard xóa cả hai
  • [ ] D) Không có sự khác biệt thực tế

💡 Giải thích: --soft: uncommit nhưng giữ changes ở staging area. --mixed (mặc định): uncommit và unstage nhưng giữ changes ở working directory. --hard: xóa sạch mọi thứ, cực kỳ nguy hiểm.

Câu 3: git revert khác git reset ở điểm cốt lõi nào?

  • [x] A) revert tạo commit mới (additive), reset viết lại lịch sử (destructive)
  • [ ] B) revert nhanh hơn reset
  • [ ] C) reset chỉ hoạt động trên local, revert chỉ hoạt động trên remote
  • [ ] D) revert xóa commit, reset giữ commit

💡 Giải thích: revert thêm commit mới đảo ngược thay đổi (lịch sử chỉ tăng, không mất). reset di chuyển HEAD về quá khứ, các commit phía sau bị "orphan" (destructive). Revert an toàn cho shared branch, reset chỉ dùng trên local.