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
  • Vừa gia hạn tên miền cho 2coffee.dev. Vậy là em nó đã 3 tuổi rồi đó mọi người. Sẵn đây nói luôn...

    Mọi người chắc cũng biết về ý nghĩa của cái tên rồi đúng không. Ấy thế mà nó lại đang dính vào "lời nguyền cà phê" bởi vì tên miền có chứa từ khoá "coffee" rất "hot", làm nhiều người hoặc công cụ tìm kiếm đánh giá sai lệch về nội dung của trang web 🥲. Nhiều lúc mình muốn tìm cách để "khai tử" cái tên này đi, thay bằng tên khác thì con đường bớt chông gai hơn.

    Tiền thân của 2coffee.dev là estacks.icu, ấy thế mà sao lại bỏ được cái tên cũ không chút đắn đo? Là vì 2coffee.dev đánh dấu sự trưởng thành trong tư duy làm sản phẩm của mình, ý là nghiêm túc hơn á. Còn stacks.icu vẫn mãi mãi là tiền thân của "Xin chào, một tách cà phê dành cho mấy ông lập trình viên đây".

    » Xem thêm
  • Privacy Guides là một dự án phi lợi nhuận nhằm cung cấp cho người dùng các hiểu biết về quyền riêng tư, đồng thời khuyến nghị những phương pháp hay công cụ để giúp đòi lại quyền riêng tư trong thế giới Internet.

    Có nhiều bài viết hay tại đây, mình lấy ví dụ 3 khái niệm hay nhầm lẫn hoặc bị đánh tráo là Quyền riêng tư (privacy), Bảo mật (security) và Ẩn danh (anonymity). Trong khi nhiều người phản đối quyền riêng tư cho rằng một người không cần quyền riêng tư nếu họ "không có gì để che giấu". "Đây là một quan niệm sai lầm nguy hiểm, vì nó tạo ra cảm giác rằng những người đòi hỏi quyền riêng tư phải là những kẻ lệch lạc, tội phạm hoặc sai trái." - Why Privacy Matters.

    » Xem thêm
  • Có một nơi rất tuyệt vời để học hoặc đang kẹt trong suy nghĩ không còn gì để học nữa thì phần bình luận ở bển Hacker News là thứ dành cho bạn.

    Y Combinator - Công ty đứng sau Hacker News tập trung vào các khoản đầu tư mạo hiểm cho các Startup tại Thung lũng Silicon, nên không ngạc nhiên khi có rất nhiều bộ óc thiên tài bình luận dạo ở trên đây. Nhưng cái dạo của họ cũng đủ cung cấp từ khoá mở ra cho chúng ta nhiều điều mới.

    Không tin ư? Chỉ cần lướt một tí, bấm bài viết nào phù hợp với thị hiếu của bạn, xem bình luận và nhớ thêm một cốc cà phê bên cạnh nhé ☕️

    » Xem thêm

Vấn đề

Note: Có thể bạn đang tìm kiếm một giải pháp sửa commit khi đã push lên remote? Nếu thế thì bạn nên đọc bài viết Làm thế nào để xóa commit đã push? để biết cách giải quyết. Bài viết bạn đang đọc đây chỉ là xóa commit "chưa" push nhưng tôi không hiểu sao nó lại lọt vào kết quả tìm kiếm của Google. Xin cảm ơn!

Commit code là việc làm thường ngày của các developer, nhưng đôi khi vì một lý do nào đó mà bạn lỡ commit thiếu nội dung hay commit xong mới phát hiện ra còn chỗ quên chưa sửa lại thì phải làm thế nào?

Nhiều người có thể sẽ chọn cách tạo một commit khác để sửa chữa lỗi lầm nhưng điều đó sẽ làm cho cây git của chúng ta xuất hiện những commit dài lê thê hay thậm chí còn có thể bị đánh giá là làm ẩu, thiếu chuyên nghiệp…

Sửa lại commit

Git cho phép chúng ta sửa đổi nội dung của commit cuối cùng bằng lệnh git commit --amend --no-edit. Bạn có thể sử dụng để giải quyết vấn đề nêu ở trên.

Ví dụ commit cuối cùng của tôi là "release version 1.0.1" và ngay khi vừa commit xong tôi phát hiện ra mình quên chưa add file README.md, do đó tôi có thể làm:

$ git log
commit 56da84715291dbb683269c085fe9a4b42aafb1e7
Author: hoaitx <[email protected]>
Date:   Sun Jun 20 15:31:35 2021 +0700

    release version 1.0.1

$ git add README.md
$ git commit --amend --no-edit
$ git log
commit ac48bc383726cfaaf4032b68ef6e6bece6cec368
Author: hoaitx <[email protected]>
Date:   Sun Jun 20 15:32:35 2021 +0700

    release version 1.0.1

Sau đó hãy thử kiểm tra lại lịch sử commit, bạn sẽ thấy file README.md đã được add vào.

Sửa lại nội dung commit vừa xong

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>.

Ví dụ tôi muốn sửa lại message "release version 1.0.1" -> "release v1.0.1" thì:

$ git commit --amend -m "release v1.0.1"
$ git log
commit dbdd6c3844a01b3d03bbc777516fba16ba07d64d
Author: hoaitx <[email protected]>
Date:   Sun Jun 20 15:33:35 2021 +0700

    release v1.0.1

Xoá commit mà không cần revert

Cách này chỉ áp dụng cho trường hợp bạn mới chỉ commit ở local chứ chưa push lên remote. Khi commit chưa push lên remote thì bạn có thể xoá chúng ở local bằng lệnh git reset --hard <remote/branch>.

Lệnh này sẽ reset lại HEAD ở local bằng với HEAD ở remote, nôm na là nó đồng bộ những commit ở remote về local nên là sẽ xoá hết những commit chưa push ở local.

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.

Ví dụ tôi reset lại branch develop ở remote name là origin:

$ git reset --hard origin/develop

Kết luận

Trên đây là một số câu lệnh git xử lý một số trường hợp liên quan đến việc commit "ẩu". Dù sao trước khi commit thì mọi người cũng nên kiểm tra lại tất cả nội dung thật kỹ nhé!

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 danh5 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ống5 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ền1 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