Chuyển đến nội dung chính

Git hoàn tác commit cuối: Hướng dẫn từng bước cho người mới bắt đầu

Hướng dẫn này dạy bạn cách hoàn tác an toàn commit Git cuối cùng bằng các lệnh và công cụ phù hợp, dù làm việc một mình hay theo nhóm.
Đã cập nhật 16 thg 4, 2026  · 10 phút đọc

Nếu bạn từng tham gia một dự án lập trình theo nhóm, bạn sẽ biết mọi thứ có thể rẽ sai rất nhanh khi cố hoàn tác một thay đổi. Chỉ một bước sai, bạn có thể xóa sạch phần việc của chính mình, hoặc tệ hơn: làm hỏng thứ mà đồng đội vừa đẩy lên.

Vì vậy, điều quan trọng là hiểu Git cung cấp những cách nào để hoàn tác sai sót, và khi nào nên dùng từng lựa chọn. Một số lệnh an toàn cho môi trường làm việc nhóm, trong khi số khác phù hợp cho local cleanup where you're okay rewriting history.

Hướng dẫn này sẽ dẫn bạn qua tất cả. Bạn sẽ học các cách khác nhau để hoàn tác commit, cách chúng hoạt động, và nên dùng cách nào tùy tình huống.

Tìm hiểu lịch sử commit của Git 

Bạn từng nhấn 'Ctrl+S' để lưu một phiên bản tài liệu rồi quay lại nó sau này? Commit trong Git cũng như vậy, nhưng cho toàn bộ codebase của bạn.

Commit trong Git là gì?

Một git commit là ảnh chụp nhanh dự án của bạn tại một thời điểm cụ thể. Nó đóng băng trạng thái hiện tại của tất cả các tệp và gán cho phiên bản đó một ID duy nhất, giống như chụp một bức ảnh có đóng dấu thời gian của mã nguồn. Bạn luôn có thể tua ngược về điểm đó nếu sau này có gì đó hỏng.

Nó hoạt động thế nào? Khi bạn sửa một tệp trong repo, các thay đổi không được lưu ngay lập tức. Thay vào đó, chúng tồn tại cục bộ trong thư mục làm việc hiện tại. Để lưu, bạn staging các thay đổi rồi commit vào repository. Lịch sử commit là nhật ký tất cả các commit đã thực hiện trên một repository. 

Commit cục bộ và commit từ xa

Commit cục bộ nằm trên máy của bạn và không hiển thị với đồng nghiệp hay cộng tác viên cho đến khi bạn quyết định chia sẻ. Điều đó nghĩa là bạn có nhiều quyền kiểm soát hơn: bạn có thể viết lại lịch sử, squash, xóa, hoặc reset mà không ảnh hưởng đến ai khác.

Commit từ xa thì ngược lại, mọi người làm việc trên repository đều truy cập được. Nghĩa là bạn không nên viết lại hay xóa các commit này. Làm vậy sẽ gây lỗi cho đồng đội nếu họ dùng cùng nhánh remote. Vì thế, hãy thận trọng và hiểu rõ mình đang làm gì trước khi viết lại lịch sử đã chia sẻ. 

Hoàn tác commit Git cuối cùng trên máy cục bộ

Trong Git, HEAD trỏ đến commit mới nhất trong lịch sử dự án của bạn. Khi bạn dùng lệnh git reset, bạn đang bảo Git di chuyển con trỏ đó đến một commit khác. 

Hãy cùng phân tích cách dùng git reset để hoàn tác commit cuối trong nhiều kịch bản khác nhau.

Dùng git reset --soft HEAD~1

Nó đưa HEAD lùi lại một commit nhưng giữ nguyên các thay đổi trong khu vực staging. Tệp của bạn không bị động tới, và mọi thứ bạn đã commit vẫn đang sẵn sàng trong staging. Dùng khi bạn muốn hoàn tác chính commit đó nhưng giữ lại toàn bộ thay đổi đã chuẩn bị và staging.

Dùng git reset --mixed HEAD~1

Lựa chọn này tiến thêm một bước. Nó cũng đưa HEAD lùi một commit nhưng xóa sạch khu vực staging. Tệp của bạn vẫn ở thư mục làm việc, nhưng không còn gì được staging nữa. Đây là chế độ mặc định của git reset.

Dùng git reset --head HEAD~1

Nó đưa HEAD lùi lại, xóa sạch khu vực staging và xóa cả các thay đổi trong thư mục làm việc. Giống như commit cuối (và mọi thay đổi đi kèm) chưa từng tồn tại.

Hãy dùng cẩn thận — một khi các thay đổi bị xóa, rất khó để khôi phục. Chỉ chạy nếu bạn hoàn toàn chắc chắn không cần gì từ commit vừa rồi.

Ví dụ 1: Hoàn tác commit cuối cục bộ (sửa lại an toàn)

Giả sử bạn vừa tạo một commit, nhưng nhận ra quên cập nhật tệp README.

Kịch bản:

Bạn đã commit các thay đổi vào main.py, nhưng quên cập nhật README.md. Bạn muốn sửa lại commit cuối mà không ảnh hưởng ai khác, và bạn vẫn chưa đẩy gì lên.

Giải pháp:

Dùng git reset --soft HEAD~1 để hoàn tác commit và giữ các thay đổi ở trạng thái staged:

git reset --soft HEAD~1

Giờ hãy cập nhật tệp README, thêm nó vào staging và commit lại mọi thứ:

git add README.md
git commit -m "Update main.py and README.md"

✅ Vì sao cách này hiệu quả: Do commit chưa được đẩy lên, bạn có thể viết lại lịch sử cục bộ mà không ảnh hưởng ai.

Hoàn tác một commit đã đẩy lên

Bạn đã đẩy một commit... và giờ thì hối hận. Ai cũng từng như vậy. Nhưng làm sao hoàn tác mà không làm hỏng công việc của đồng đội? 

Viết lại lịch sử với git push --force

Thông thường, Git chỉ cho phép bạn push nếu nhánh cục bộ của bạn vừa được pull và đồng bộ với nhánh remote. Nhưng bạn có thể bỏ qua quy tắc này bằng lệnh đầy sức mạnh như push --force. Nó ghi đè toàn bộ lịch sử trên remote bằng nội dung trong nhánh cục bộ của bạn.

Đó là lý do --force vừa mạnh vừa nguy hiểm. Trong môi trường nhóm, nó có thể xóa commit của đồng nghiệp nếu các commit đó chưa được bạn pull về. Chỉ dùng khi bạn biết mình đang làm gì — và lý tưởng nhất là khi bạn là người duy nhất làm trên repo đó.

Ngoài push --force, còn có pull --force, một lệnh mạnh khác cần dùng thận trọng. Learn about it here.

Các lựa chọn an toàn hơn với git revert

Nếu bạn muốn hoàn tác một commit mà không xóa lịch sử, git revert là lựa chọn tốt nhất. Nó không xóa commit; nó tạo một commit mới để đảo ngược các thay đổi.

Giả sử bạn đã commit một tệp tên streamlit_app.py, và bạn muốn loại bỏ nó. git revert sẽ tạo một commit mới xóa riêng tệp đó, giữ nguyên phần còn lại của lịch sử.

Theo mặc định, git revert nhắm vào commit gần nhất. Tuy nhiên, bạn cũng có thể revert các commit cũ hơn bằng cách chỉ định ID commit của chúng.

Ví dụ 2: Hoàn tác an toàn một commit đã đẩy trên nhánh dùng chung

Giả sử bạn đã đẩy một thay đổi cấu hình bị lỗi và cần đảo ngược mà không xóa lịch sử.

Kịch bản:

Bạn đã đẩy một commit thêm một dòng sai vào config.yaml. Nhóm của bạn đang làm việc trên cùng nhánh remote (main), nên bạn không thể dùng reset hoặc force-push.

Giải pháp:

Dùng git revert để hoàn tác commit một cách an toàn:

git revert <commit-hash>

Lệnh này sẽ mở một trình soạn thảo để xác nhận thông điệp revert. Lưu và đóng trình soạn thảo để tạo commit mới đảo ngược commit trước đó.

Nếu commit cuối là commit cần revert:

git revert HEAD

Sau đó đẩy thay đổi lên:

git push origin main

✅ Vì sao cách này hiệu quả: git revert không viết lại lịch sử — nó thêm một commit mới. Điều đó khiến nó an toàn cho nhánh dùng chung và quy trình làm việc nhóm.

Trực quan hóa và xác nhận thay đổi

Đôi khi bạn chỉ muốn xem đã có gì xảy ra — giống như cuộn lại các phiên bản trước để tìm commit muốn hoàn tác. Git cung cấp công cụ để làm đúng điều đó.

Dùng git log để kiểm tra lịch sử commit 

Chạy git log trong terminal, bạn sẽ nhận danh sách đầy đủ tất cả commit trên nhánh hiện tại. Bạn có thể dùng nó để xác định commit cụ thể cần hoàn tác hoặc chỉnh sửa. 

Ví dụ: đầu ra git log có thể như sau:

  • e3a1b7f Sửa lỗi chính tả trong README  
  • 4f2c9a1 Thêm xác thực đăng nhập  
  • 9d5b3e8 Commit khởi tạo  

Mỗi dòng hiển thị một hash commit và thông điệp. Nếu muốn hoàn tác một thay đổi cụ thể, chỉ cần sao chép hash commit đó và dùng với git revert

Dùng công cụ GUI hoặc tiện ích mở rộng

Nếu bạn không phải nhà phát triển hoặc chưa từng làm việc với hệ thống quản lý phiên bản, tất cả lệnh dòng lệnh có thể giống như một ngôn ngữ xa lạ. Lúc đó công cụ GUI sẽ hữu ích. Chúng khiến Git trở nên trực quan và thân thiện với người mới, để bạn tập trung vào điều quan trọng mà không cần thuộc lòng lệnh.

GitHub Desktop 

GitHub Desktop là ứng dụng miễn phí cung cấp giao diện gọn gàng, dễ dùng để làm việc với repository trên GitHub. Sau khi cài đặt, bạn có thể dùng nó để tạo nhánh, tạo commit, push lên remote và quản lý dự án — tất cả bằng thao tác nhấp chuột thay vì các lệnh Git.

Nó rất phù hợp nếu bạn mới dùng Git hoặc chỉ muốn trải nghiệm mượt mà hơn khi quản lý thay đổi.

Giao diện người dùng GitHub Desktop

Giao diện người dùng GitHub Desktop. Nguồn ảnh

Sourcetree

Sourcetree là công cụ Git GUI miễn phí cho cả Mac và Windows. Nó cung cấp cách trực quan để quản lý nhánh, commit và merge mà không cần chạm vào terminal. Nhẹ, thân thiện với người mới và hoạt động tốt với các nền tảng phổ biến như GitHub, GitLab và Bitbucket. 

Vì do Atlassian phát triển, nó cũng tích hợp tốt với các công cụ Atlassian khác như Jira, Confluence và Bamboo, là lựa chọn tuyệt vời nếu nhóm bạn đã dùng hệ sinh thái đó.

Giao diện người dùng Sourcetree

Giao diện người dùng Sourcetree. Nguồn ảnh

GitKraken

GitKraken là Git GUI giàu tính năng giúp làm việc với repository trở nên mượt mà và trực quan. Điểm nổi bật chính là đồ thị — dòng thời gian tương tác, đầy màu sắc về lịch sử repo giúp việc theo dõi nhánh, merge và commit trở nên dễ dàng.

Bên trái là cây tệp của dự án. Bên phải là thông tin chi tiết về bất kỳ commit, tệp hoặc nhánh nào bạn nhấp vào. Trực quan, thân thiện với người mới và cũng đầy đủ tính năng mạnh mẽ cho người dùng nâng cao.

GitKraken miễn phí cho mục đích cá nhân, nhưng nếu bạn làm trong môi trường doanh nghiệp hoặc quản lý repo riêng tư, bạn sẽ cần gói trả phí.

Giao diện người dùng Gitkraken

Gitkraken giao diện người dùng. Nguồn ảnh.

Thực hành tốt nhất khi hoàn tác commit Git

Hoàn tác một commit không có gì đáng sợ miễn là bạn tuân theo các thực hành tốt. Hãy cùng thảo luận chúng là gì.

Dùng nhánh để thử nghiệm

Bất cứ khi nào bạn xây dựng tính năng mới hoặc sửa lỗi, hãy tạo một nhánh riêng từ main. Thực hiện toàn bộ công việc ở đó, kiểm thử kỹ, rồi mới hợp nhất trở lại nhánh main.

Bằng cách này, mọi sai sót hoặc hoàn tác sẽ được giữ an toàn trong nhánh của bạn mà không làm rối công việc của phần còn lại nhóm.

Khi phân vân, hãy dùng git revert

Giả sử bạn đã tạo vài commit trên nhánh cục bộ và vô tình đẩy chúng lên nhánh main. Hụt hẫng. Giờ bạn muốn hoàn tác một trong các commit đó mà không làm rối lịch sử đã chia sẻ. Đó là lúc git revert cứu nguy.

Chạy git revert HEAD~1. Lệnh này tạo một commit mới đảo ngược các thay đổi từ commit áp chót (vì HEAD~1 trỏ tới nó). Nó không xóa gì cả, thay vào đó đảo chiều thay đổi một cách sạch sẽ, có thể theo dõi.

Sau khi làm xong, đừng quên đẩy bản sửa lên remote bằng git push origin <your-branch-name>.

Lưu ý: Nếu các thay đổi đã được đẩy lên nhánh dùng chung, hãy dùng git revert. Nó giữ nguyên lịch sử commit và sẽ không làm gián đoạn đồng đội của bạn.

Ghi chép lại thay đổi

Bạn không cần mở một trang Confluence chỉ để duy trì lịch sử phiên bản vì Git đã làm điều đó cho bạn. Mấu chốt là dùng nó một cách thông minh.

Hãy bắt đầu với thông điệp commit rõ ràng, có ý nghĩa. Nếu bạn đang revert điều gì đó, hãy đảm bảo thông điệp giải thích vì sao bạn hoàn tác.

Và ghi lại ID commit cùng tóm tắt ngắn về những gì đã thay đổi. Chừng đó thường là đủ cho mục đích tài liệu.

Hợp tác trong nhóm 

Khi bạn dùng các lệnh như git reset, rebase hoặc commit --amend trên nhánh mà người khác cũng đang dùng, bạn đang thay đổi lịch sử commit. Bất kỳ ai đã pull lịch sử cũ giờ sẽ gặp xung đột. 

Vì vậy, chỉ dùng các lệnh viết lại trên nhánh cục bộ hoặc nhánh tính năng. Nếu buộc phải force-push hoặc viết lại lịch sử đã chia sẻ, hãy thông báo cho nhóm sớm nhất có thể. 

Kết luận 

Git cung cấp nhiều cách để hoàn tác sai sót; nhưng biết khi nào và cách dùng từng công cụ mới là điều phân biệt nhà phát triển tự tin với người bối rối.

Chúng ta đã tìm hiểu cách git reset hoạt động ở các chế độ khác nhau, khi nào dùng git revert, và vì sao việc chọn đúng công cụ theo tình huống là rất quan trọng.

Tóm lại:

  • Tránh viết lại lịch sử sau khi đã đẩy lên các nhánh dùng chung
  • Thảo luận sớm nếu buộc phải force-push
  • Dùng git revert để hoàn tác an toàn các commit đã đẩy

Ở bước tiếp theo, learn how you can revert merge commit here. Nếu bạn đã nắm vững căn bản và sẵn sàng đi sâu hơn, hãy xem khóa học Git trình độ trung cấp của chúng tôi

FAQs

git reset --soft HEAD~1 thực sự làm gì?

Nó đưa con trỏ HEAD của bạn lùi một commit nhưng giữ lại tất cả thay đổi ở trạng thái staged. Rất phù hợp khi bạn muốn sửa lại commit mà không mất bất kỳ công việc nào.

Khi nào tôi nên dùng git reset --mixed thay vì --soft?

Dùng --mixed khi bạn muốn giữ các thay đổi trong tệp nhưng loại chúng khỏi khu vực staging. Hữu ích để chỉnh sửa trước khi commit lại.

Dùng git push --force có nguy hiểm không?

Có, đặc biệt trong môi trường làm việc nhóm. Nó viết lại lịch sử commit trên nhánh remote và có thể xóa công việc của đồng đội nếu không dùng cẩn thận.

Sự khác nhau giữa git revert và git reset là gì?

git revert thêm một commit mới để đảo ngược thay đổi mà không động vào lịch sử, trong khi git reset di chuyển HEAD và có thể làm thay đổi lịch sử — đặc biệt rủi ro nếu đã đẩy lên.

Tôi có thể hoàn tác một commit mà không mất các thay đổi không?

Có, dùng git reset --soft để giữ thay đổi ở trạng thái staged hoặc --mixed để giữ chúng trong thư mục làm việc.

Cách an toàn nhất để hoàn tác commit trong repo dùng chung là gì?

Hãy dùng git revert. Nó giữ nguyên lịch sử bằng cách tạo commit mới đảo ngược thay đổi, tránh xung đột với đồng đội.

Làm sao tìm commit tôi muốn hoàn tác?

Dùng git log để liệt kê các commit trước đó. Sao chép hash của commit bạn muốn revert hoặc reset về.

Các công cụ GUI như GitHub Desktop có thể revert commit không?

Có, các công cụ GUI cung cấp cách thân thiện để hoàn tác commit mà không cần nhớ cú pháp dòng lệnh. Chúng rất phù hợp cho người mới.

Điều gì xảy ra với lịch sử commit sau khi reset?

Với git reset, commit sẽ bị loại khỏi lịch sử của bạn — trừ khi chúng đã được đẩy lên. Khi đó, remote vẫn còn bản ghi trừ khi bạn force-push.

Có ổn không nếu sửa (amend) một commit sau khi đã đẩy lên?

Không, trừ khi đã phối hợp trước. Sửa commit (amend) rồi force-push có thể làm gián đoạn công việc chung. Chỉ làm trên nhánh riêng hoặc dự án cá nhân.


Srujana Maddula's photo
Author
Srujana Maddula
LinkedIn

Srujana là một cây bút công nghệ tự do với bằng Cử nhân Khoa học Máy tính. Việc viết về nhiều chủ đề như khoa học dữ liệu, điện toán đám mây, phát triển, lập trình, bảo mật và nhiều lĩnh vực khác đến với cô một cách tự nhiên. Cô yêu thích văn học kinh điển và khám phá những điểm đến mới.

Chủ đề

Tìm hiểu thêm về Git với các khóa học này!

Courses

Giới thiệu về Git

2 giờ
70.9K
Khám phá các nguyên tắc cơ bản của Git trong việc kiểm soát phiên bản cho các dự án phần mềm và dữ liệu của quý vị.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow