Tôi vừa lỡ commit sai, làm sao để sửa lại ngay lập tức?

Tôi vừa lỡ commit sai, làm sao để sửa lại ngay lập tức?

Vấn đề

Lưu ý: Nếu bạn đang tìm kiếm xoá commit đã push hãy tham khảo giải pháp này Làm thế nào để xóa commit đã push?. Bài viết dưới đây chỉ là hướng dẫn xóa commit "chưa" push nhưng không hiểu sao lại lọt vào kết quả tìm kiếm của Google nhiều nhất. Xin cảm ơn!

Nhiệm vụ hàng ngày của lập trình viên là viết mã, cho đến chiều tối trước khi ra về chúng ta thường kháo nhau rằng "đã commit code lên chưa đấy?". Hay thi thoảng lại nghe một câu đùa tai quái như dù trời có sập thì trước khi ra về đừng quên commit code. Vì sự thúc giục vội vàng từ ai đó mà sau khi commit xong, bạn phát hiện ra còn một tệp nữa quên chưa thêm vào cùng với commit. Tức lắm luôn mà chẳng lẽ phải thêm một commit mới để đẩy nốt lên remote?

Nhiều người chọn cách tạo một commit mới để sửa chữa lỗi lầm, nhưng điều đó hơi thừa vì có thể bạn chưa biết rằng commit chưa push lên vẫn còn khả năng sửa lại được. Vậy làm thế nào để sửa lại commit ngay lập tức?

Thêm nội dung mới vào commit

Git cho phép chúng ta thay đổi commit cuối cùng bằng lệnh git commit --amend --no-edit.

Ví dụ ngay khi vừa commit xong, phát hiện ra mình quên chưa add README.md:

$ git add README.md
$ git commit --amend --no-edit

Thế là xong, thay đổi của README.md lúc này đã xuất hiện trong nội dung của commit cuối cùng.

Bỏ nội dung khỏi commit

Tương tự, nếu lỡ thêm nhầm một tệp, có thể gỡ ra bằng cách dùng git reset HEAD^ path/to/file.

Ví dụ ngay khi vừa commit xong, phát hiện ra lỡ tay add README.md vào trong commit, muốn bỏ ra thì:

$ git reset HEAD^ README.md
$ git commit --amend --no-edit

Sửa lại message của commit

Git cũng cho phép bạn sửa lại message của commit cuối cùng bằng lệnh git commit --amend -m <message>.

$ git commit --amend -m "edited message"

Soft reset

Đây là cách khi bạn muốn đem mọi thứ quay trở lại với trước khi commit. Tức là huỷ commit cuối cùng nhưng giữ lại tất cả thay đổi ở trạng thái đã git add (staged).

$ git reset --soft HEAD^

Lệnh này huỷ bỏ commit cuối cùng và đưa tất cả thay đổi trở lại staged, giúp bạn bắt đầu commit lại từ đầu.

Xoá commit chưa push mà không cần revert

Cách này áp dụng trong trường mới commit ở local và chưa push lên remote.

$ git reset --hard origin/branch

Với origin là remote và branch là nhánh đang làm việc.

Lưu ý: hard reset đồng bộ remote với local. Nghĩa là remote đang có những commit nào thì mang xuống local. Tất cả commit ở local mà không có trên remote sẽ bị xoá hết. Cẩn thận khi sử dụng.

Ví dụ tôi vừa lỡ commit vào develop. Muốn xoá nó đi thì:

$ git reset --hard origin/develop