Git Reset vs Git Revert: Tuyệt chiêu “quay xe” an toàn cho Developer

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Reset và Revert: Hai con đường khác biệt để sửa sai

Hồi mình mới đi làm, có lần lỡ tay commit nhầm file .env chứa mật khẩu database lên server. Hoảng quá, mình search vội rồi chạy ngay git reset --hard. Kết quả? Commit đó biến mất trên máy mình thật, nhưng cả team 5 người sau đó không ai push code được nữa vì lệch history nghiêm trọng. Đó là bài học xương máu đầu tiên của mình về việc dùng nhầm công cụ xử lý sự cố.

Cả hai lệnh này đều giúp bạn quay lại trạng thái cũ, nhưng cách chúng xử lý lịch sử (commit history) lại khác xa nhau:

  • Git Reset: Giống như dùng cục tẩy xóa đi những dòng nhật ký đã viết. Bạn xóa bỏ hoàn toàn các commit như thể chúng chưa từng tồn tại.
  • Git Revert: Giống như viết thêm một dòng đính chính: “Nội dung dòng trên là sai, hãy làm ngược lại”. Lịch sử cũ vẫn còn đó, và bạn có thêm một commit mới để đảo ngược thay đổi.

So sánh ưu và nhược điểm thực tế

1. Git Reset – “Cỗ máy thời gian” đầy rủi ro

Ưu điểm: Giúp log commit cực kỳ gọn gàng. Nếu bạn commit nhầm trên máy cá nhân và chưa push lên server, Reset là cách nhanh nhất để xóa dấu vết.

Nhược điểm: Cực kỳ nguy hiểm trên các branch chung như main hay develop. Reset sẽ thay đổi lịch sử commit của dự án. Nếu đồng nghiệp đã kéo code cũ về, việc bạn Reset sẽ gây xung đột nặng nề khi họ cố gắng đồng bộ lại.

2. Git Revert – Cách tiếp cận chuyên nghiệp

Ưu điểm: An toàn tuyệt đối cho dự án làm việc nhóm. Nó không xóa bất kỳ dữ liệu nào trong quá khứ. Điều này giúp team giữ nguyên mạch lịch sử mà không bao giờ gặp lỗi “non-fast-forward”.

Nhược điểm: Làm danh sách commit trông hơi rối. Bạn sẽ thấy những commit kiểu “Revert ‘Add login feature'”. Nếu phải revert liên tục 5-10 lần, nhìn vào Git log sẽ khá mệt mỏi.

Chọn Reset hay Revert để không bị đồng nghiệp “tế”?

Sau nhiều năm quản lý các dự án từ 2 đến 20 người, mình rút ra quy tắc nằm lòng thế này:

  1. Dùng Git Reset khi: Bạn đang code một mình trên branch cá nhân (feature branch) và chưa push lên GitHub/GitLab. Ngoài ra, Reset rất hữu ích để gộp 5-6 commit vụn vặt thành một commit lớn trước khi tạo Pull Request.
  2. Dùng Git Revert khi: Code đã nằm trên server hoặc có người khác đang làm chung branch. Đây là cách xử lý văn minh nhất để tránh làm hỏng workflow của mọi người.

Trong team 8 người hiện tại của mình, mình cấm tuyệt đối force push lên các branch chính. Nhờ kỷ luật này, số lượng ca cấp cứu do lệch history đã giảm về con số 0 trong suốt 1 năm qua.

Hướng dẫn triển khai chi tiết

Sử dụng Git Reset với 3 cấp độ

Bạn cần phân biệt rõ 3 flag này để tránh mất code oan uổng.

–soft: Quay lại nhưng giữ nguyên code

Lệnh này chỉ di chuyển con trỏ HEAD, toàn bộ code bạn vừa viết vẫn nằm trong Staging Area. Đây là cách tuyệt vời để gom nhiều commit nhỏ thành một.

# Gom commit cuối cùng lại để sửa message
git reset --soft HEAD~1

–mixed (Mặc định): Giữ code nhưng chưa add

Đây là chế độ mặc định nếu bạn không điền flag. Code vẫn còn đó nhưng ở trạng thái Unstaged, bạn cần git add lại nếu muốn commit tiếp.

# Quay lại commit có mã hash abc1234
git reset abc1234

–hard: Xóa sạch không dấu vết – Hãy cẩn thận!

Lệnh này sẽ xóa bỏ mọi thay đổi và đưa source code về đúng trạng thái của commit chỉ định. Đừng dùng nó trừ khi bạn chắc chắn không cần đống code đó nữa.

# Xóa sạch mọi thứ để quay về trạng thái sạch nhất
git reset --hard HEAD

Sử dụng Git Revert

Revert đơn giản và an toàn hơn. Bạn chỉ cần tìm commit lỗi và ra lệnh đảo ngược.

# Xem lịch sử để lấy mã hash
git log --oneline

# Đảo ngược commit lỗi (ví dụ: e4f5g6h)
git revert e4f5g6h

Git sẽ tự động mở editor để bạn nhập lý do revert. Bạn chỉ cần lưu lại là xong. Nếu gặp conflict, hãy xử lý nó giống như khi bạn merge code thông thường.

Mẹo cứu nguy: Phao cứu sinh mang tên Reflog

Lỡ tay git reset --hard và mất trắng 1 ngày công code? Đừng vội tuyệt vọng. Git có một cơ chế bí mật gọi là reflog để ghi lại mọi di chuyển của con trỏ HEAD.

Hãy gõ ngay:

git reflog

Bạn sẽ thấy danh sách mọi hành động vừa thực hiện. Chỉ cần tìm mã hash ngay trước lúc bạn chạy lệnh Reset, sau đó Reset ngược lại mã đó là code sẽ hồi sinh. Mình đã dùng cách này cứu nguy cho rất nhiều bạn Junior trong team khi lỡ tay “nghịch dại”.

Chốt lại một câu ngắn gọn: Local thì Reset, Public thì Revert. Nắm vững tư duy này, bạn sẽ làm chủ hoàn toàn mã nguồn và tự tin hơn trong mọi tình huống xử lý sự cố.

Share: