Menu
CoddyTech

Git Reset

Cập nhật lần cuối

git reset di chuyển nhánh hiện tại sang một commit khác và, tùy chế độ, cập nhật vùng staging (index) cùng working tree cho khớp. Ba chế độ chỉ khác nhau ở phạm vi cập nhật: --soft di chuyển nhánh rồi dừng, --mixed (mặc định) đặt lại cả vùng staging, còn --hard ghi đè luôn các tệp đang làm việc.

Vì --hard xóa mất phần việc chưa commit, hãy biết rõ mình cần chế độ nào trước khi chạy. Với những commit đã push, nên dùng git revert. Bạn có thể thử các lệnh này an toàn trong terminal playground: một shell thật ngay trên trình duyệt.

git reset đưa HEAD lùi về một commit trước đó; các commit sau nó rời khỏi nhánh nhưng vẫn khôi phục được qua reflog.

Ba chế độ

Chế độDi chuyển nhánhĐặt lại stagingĐặt lại working tree
--softCóKhôngKhông
--mixed (mặc định)CóCóKhông
--hardCóCóCó

Cú pháp

LệnhTác dụng
git reset --soft HEAD~1Hủy commit cuối, thay đổi vẫn ở trạng thái staged
git reset HEAD~1Hủy commit cuối, thay đổi trở về unstaged
git reset --hard HEAD~1Hủy commit cuối, bỏ luôn thay đổi
git reset <file>Bỏ stage một tệp (giữ nguyên thay đổi)
git reset --hard origin/mainÉp nhánh cục bộ khớp với remote

Tình huống thường gặp

Mục tiêuLệnh
Bỏ stage tất cảgit reset
Bỏ stage một tệpgit reset README.md
Lùi lại 3 commit, giữ phần việc đã làmgit reset --soft HEAD~3
Bỏ toàn bộ thay đổi cục bộ kể từ một commitgit reset --hard <hash>

Câu hỏi thường gặp về git reset

--soft, --mixed và --hard khác nhau thế nào?
Cả ba đều di chuyển con trỏ nhánh tới commit đích; điểm khác là chúng còn động tới những gì. --soft không đổi gì thêm, nên thay đổi của bạn vẫn ở trạng thái staged. --mixed (mặc định) xóa luôn vùng staging, nên thay đổi trở về unstaged nhưng vẫn nằm trong tệp. --hard còn ghi đè working tree cho khớp với commit đích, bỏ đi mọi thay đổi chưa commit.
Làm sao bỏ stage một tệp bằng git reset?
Chạy git reset <file> (ví dụ git reset README.md), hoặc git reset không kèm đường dẫn để bỏ stage tất cả. Lệnh này đưa tệp ra khỏi vùng staging nhưng giữ nguyên chỉnh sửa trong working tree. Ở các bản Git mới, bạn cũng có thể dùng git restore --staged <file>, cho kết quả tương tự nhưng rõ ràng hơn.
git reset --hard có hoàn tác được không?
Không, nếu xét working tree: --hard xóa vĩnh viễn các thay đổi chưa commit. Tuy vậy, phần việc đã commit mà bị reset mất thường vẫn lấy lại được: chạy git reflog để tìm hash của commit, rồi git reset --hard <hash> (hoặc tạo một nhánh tại commit đó). Thay đổi chưa từng được stage hay commit thì không khôi phục được, nên hãy dùng --hard cẩn thận.
git reset và git revert khác nhau thế nào?
git reset viết lại lịch sử bằng cách lùi nhánh về sau, ổn với commit cục bộ nhưng nguy hiểm với commit bạn đã push. git revert giữ nguyên lịch sử và thêm một commit mới để hoàn tác commit cũ, đây là lựa chọn an toàn cho nhánh dùng chung.
git reset --soft HEAD~1 làm gì?
Lệnh này hủy commit cuối nhưng giữ mọi thay đổi của commit đó ở trạng thái staged. HEAD~1 nghĩa là commit ngay trước commit hiện tại, nên nhánh lùi một bước trong khi vùng staging và working tree giữ nguyên. Đây là cách nhanh nhất để làm lại một commit: sửa tệp hoặc thông điệp, rồi commit lại. Xem git undo last commit để biết thêm các cách khác.
HEAD~1 nghĩa là gì?
HEAD là commit bạn đang đứng, còn ~1 là commit cha đầu tiên của nó, tức lùi một commit. HEAD~2 là lùi hai commit, và cứ thế. Với commit thông thường, HEAD^ giống hệt HEAD~1.
Có thể luyện tập lệnh này online không?
Có. Mở terminal playground để chạy git reset trong một shell thật ngay trên trình duyệt, không cần cài đặt gì. Khóa học Git tương tác miễn phí của Coddy cũng hướng dẫn từng bước cách reset và hoàn tác thay đổi.
Hình minh họa các ngôn ngữ lập trình của Coddy

Học Git cùng Coddy

Bắt đầu