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?

Tin ngắn hàng ngày dành cho bạn
  • Một thư viện mang lại rất nhiều hiệu ứng chuyển động cho trang web của bạn: animejs.com

    Vào xem, cuộn cuộn tí mà lác con mắt 😵‍💫

    » Xem thêm
  • Một kho lưu trữ tổng hợp lại danh sách system prompt bị "lộ" trên Internet. Rất hữu ích cho bạn nào nghiên cứu về cách viết system prompt. Phải nói rằng họ tỉ mỉ thật 😅

    jujumilk3/leaked-system-prompts

    » Xem thêm
  • Kết thúc kỳ nghỉ, để thấy nó dữ dội đến đâu thì tổng số bước đã đi trong 4 ngày là 45k các bạn ạ 😆

    » Xem thêm

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
Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (3)

Nội dung bình luận...
Avatar
Ẩn danh9 tháng trước

Muốn sửa lại message của commit cũ ko phải commit gần nhất, thì làm sao ạ?

Trả lời
Avatar
Xuân Hoài Tống9 tháng trước

Hơi khó em ạ, nếu thế em phải làm một số lệnh rồi force push lên remote. Mà để làm vậy thì tương đối khó, vì chẳng ai dám force push vì phát sinh nhiều vấn đề trong làm việc nhóm. Còn nếu dự án của em, một mình em làm thì em có thể force nếu muốn.

Avatar
Lê Kế Hiền2 năm trước

vậy dùng source tree cho dễ =)) cl rối rắm

Trả lời
Avatar
Trịnh Cường2 năm trước

"Lưu ý rằng việc này cũng đồng nghĩa với những commit chưa push ở local sẽ bị mất hết và bạn sẽ phải viết lại.". câu này có nghĩa là những đoạn code thay đổi ở commit đó cũng mất hết à bạn

Trả lời
Avatar
Xuân Hoài Tống2 năm trước

Đúng rồi bạn, vì lệnh đó là reset lại branch local cho giống y hệt remote nên commit bạn chưa push ở local cũng sẽ bị mất hết