Trung BìnhGit iconGit

Undo một public commit đã merge vào main: revert vs reset — khi nào dùng cái nào?

Reset (git reset --hard HEAD~1): di chuyển HEAD pointer về commit cũ, xóa commits khỏi history. KHÔNG dùng trên main/shared branch — sẽ cần force push, gây disaster cho mọi người đã pull.

Revert (git revert <commit>): tạo commit MỚI undo changes của commit cũ. An toàn cho shared branches vì không rewrite history.

bash
# Revert 1 commit:
git revert abc123
# Revert merge commit (phải chỉ định mainline parent):
git revert -m 1 abc123  # -m 1 = giữ lại parent thứ 1 (main branch)

# Revert range commits:
git revert abc123..def456
# Revert nhiều commits nhưng chỉ 1 commit revert:
git revert --no-commit abc123 def456
git commit -m "revert: remove broken payment feature"

Ví dụ thực tế: deploy feature lên production, users báo lỗi nghiêm trọng → git revert -m 1 <merge-commit> → push → deploy → feature bị undo ngay mà không ảnh hưởng history.

Khi nào dùng reset: trên local branch chưa share, hoặc clean up local staging area.

Lưu ý revert merge commit: nếu sau đó muốn re-merge feature đó, phải revert lại revert commit trước — không thể merge thẳng vì git sẽ "thấy" commits đã được merge rồi.

Xem toàn bộ Git cùng filter theo level & chủ đề con.

Mở danh sách Git