Git: hoàn tác commit cuối
Cập nhật lần cuối
Để hoàn tác commit gần nhất, trước tiên hãy quyết định số phận các thay đổi của nó. Giữ chúng ở trạng thái staged bằng git reset --soft HEAD~1, giữ ở trạng thái unstaged bằng git reset HEAD~1 thông thường, hoặc bỏ đi bằng git reset --hard HEAD~1. Nếu commit chỉ sai một chút, git commit --amend sửa nó ngay tại chỗ. Nếu commit đã được push, hãy dùng git revert thay vì viết lại lịch sử. Để hoàn tác một commit cũ hơn hoặc nhiều commit cùng lúc, xem trang git undo commit.
Bạn có thể thử các lệnh này trong terminal playground: một shell thật ngay trên trình duyệt, không cần cài đặt gì.
Chọn cách xử lý thay đổi
| Mục tiêu | Lệnh |
|---|---|
| Hủy commit, thay đổi vẫn staged | git reset --soft HEAD~1 |
| Hủy commit, thay đổi trở về unstaged | git reset HEAD~1 |
| Hủy commit, bỏ luôn thay đổi | git reset --hard HEAD~1 |
| Sửa commit cuối (thông điệp hoặc tệp) | git commit --amend |
| Hoàn tác commit đã push | git revert HEAD |
Ví dụ từng bước
Hoàn tác commit cuối và commit lại với thông điệp rõ ràng hơn.
| Bước | Lệnh | Kết quả |
|---|---|---|
| 1 | git reset --soft HEAD~1 | Commit bị gỡ, thay đổi vẫn ở trạng thái staged |
| 2 | git commit -m "clearer message" | Commit lại đúng các thay đổi đó |
Câu hỏi thường gặp về hoàn tác commit cuối trong Git
Làm sao hoàn tác commit cuối mà vẫn giữ thay đổi?
git reset --soft HEAD~1. Lệnh này gỡ commit cuối nhưng giữ thay đổi của nó ở trạng thái staged, để bạn commit lại ngay. Nếu muốn thay đổi nằm ở trạng thái unstaged trong working tree, dùng git reset HEAD~1 (chế độ mặc định).Làm sao hoàn tác commit cuối và xóa luôn thay đổi?
git reset --hard HEAD~1. Lệnh này gỡ commit và bỏ các thay đổi của nó khỏi working tree. Đây là thao tác phá hủy: nếu có thể bạn sẽ cần phần việc đó, hãy dùng --soft, hoặc khôi phục sau bằng git reflog.Nếu chỉ cần sửa thông điệp commit thì sao?
git commit --amend. Lệnh này mở lại commit cuối để bạn sửa thông điệp (và stage lại tệp nếu cần) mà không tạo commit riêng. Tránh amend một commit đã push, vì làm vậy là viết lại lịch sử.Làm sao hoàn tác commit cuối sau khi đã push?
git revert HEAD. Revert tạo một commit mới đảo ngược commit cuối, giữ nguyên lịch sử: lựa chọn an toàn cho nhánh dùng chung. Reset một commit đã push sẽ buộc mọi người phải xử lý một nhánh bị viết lại.Có thể luyện tập lệnh này online không?
Có. Mở terminal playground để chạy các lệnh này 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 hoàn tác thay đổi.