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

Hướng dẫn Git Reset và Revert cho người mới bắt đầu

Khám phá cách dùng git reset và revert để quản lý lịch sử dự án. Thực hành với các ví dụ chi tiết về soft, mixed và hard reset. Tìm hiểu sự khác biệt giữa hai lệnh này.
Đã cập nhật 5 thg 10, 2026  · 8 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Git khởi đầu là công cụ dành cho nhà phát triển phần mềm, nhưng nay đã trở thành tiêu chuẩn cho bất kỳ ai làm việc với mã nguồn. Hiện nay, các nhà khoa học dữ liệu, kỹ sư dữ liệu và kỹ sư máy học cũng đang áp dụng những thực hành tốt này.

Trong hướng dẫn này, tôi trình bày những khác biệt then chốt giữa git reset và git revert, hai lệnh Git để hoàn tác thay đổi. Tôi sẽ đi qua các ví dụ thực tế cho từng chế độ, từ khởi tạo dự án đến hoàn tác các commit cụ thể.

Tóm tắt nhanh (TL;DR)

  • git reset di chuyển con trỏ nhánh lùi lại, loại bỏ các commit khỏi lịch sử. Dùng để dọn dẹp cục bộ trước khi đẩy lên.

  • git reset --soft giữ thay đổi ở trạng thái đã stage, --mixed (mặc định) bỏ stage, và --hard loại bỏ hoàn toàn.

  • git revert tạo một commit mới để hoàn tác một commit trước đó. Dùng cho các thay đổi đã được đẩy lên nhánh dùng chung.

  • Không bao giờ dùng git reset trên các nhánh dùng chung. Nếu đã đẩy lên, hãy dùng git revert.

  • Nếu bạn lỡ chạy git reset --hard, hãy kiểm tra git reflog để khôi phục các commit đã mất.

Git là gì?

Git là công cụ kiểm soát phiên bản mã nguồn mở được tạo ra năm 2005 bởi Linus Torvalds. Chủ yếu được dùng để theo dõi thay đổi trong tệp dự án một cách hiệu quả, giúp các thành viên dự án có bản ghi mọi thay đổi và hợp nhất thay đổi mà không mất mát thông tin quan trọng. Khóa học

Bên cạnh đó, Introduction to GitHub Concepts giới thiệu các tính năng chính của GitHub, cách điều hướng giao diện và thực hiện thành công các tác vụ cộng tác hằng ngày.

Git revert và Git reset là hai lệnh dùng để hoàn tác thay đổi đối với mã và lịch sử dự án, nhưng theo những cách khác nhau. Trước khi đi sâu vào quy trình, hãy tạo một dự án Git.

Tạo một dự án Git

Dưới đây là hướng dẫn tạo một dự án git và khởi tạo với một số tệp:

mkdir git_revert_reset
cd git_revert_reset
git init .
  • mkdir git_revert_reset tạo một thư mục tên là git_revert_reset.

  • cd git_revert_reset di chuyển vào thư mục.

  • git init . khởi tạo thư mục thành một kho git.

Coi đây là một dự án khoa học dữ liệu, ta có thể tạo các tệp sau cho việc thu thập dữ liệu, tiền xử lý dữ liệu và huấn luyện mô hình bằng lệnh touch này:

touch data_acquisition.py data_preprocessing.py model_training.py

Đây là nội dung cuối cùng của thư mục dự án.

git_revert_reset
      |---------- data_acquisition.py
      |---------- data_preprocessing.py
      |---------- model_training.py

Git Reset 

Sơ đồ Trước và Sau Git Reset

Sơ đồ Git Reset (Nguồn)

Lệnh git reset dùng để hoàn tác các thay đổi trong thư mục làm việc và quay lại một commit cụ thể, đồng thời loại bỏ tất cả commit được tạo sau đó.

Ví dụ, giả sử bạn đã tạo mười commit. Dùng git reset trên commit đầu tiên sẽ xóa chín commit sau, đưa bạn về trạng thái của commit đầu tiên.

Trước khi dùng git reset, điều quan trọng là cân nhắc kiểu thay đổi bạn định thực hiện; nếu không, bạn có thể gây rối nhiều hơn là sửa chữa.

Bạn có thể dùng nhiều tùy chọn cùng với git reset, nhưng đây là ba tùy chọn chính. Mỗi tùy chọn phù hợp với một tình huống cụ thể: git reset --soft, git reset --mixed và git reset --hard

git reset --soft

--soft nhằm thay đổi tham chiếu HEAD (nơi commit cuối cùng trên máy cục bộ) về một commit cụ thể. Ví dụ, nếu nhận ra rằng ta quên thêm một tệp vào commit, ta có thể lùi lại bằng --soft theo các định dạng sau:

  • git reset --soft HEAD~n để lùi về commit với tham chiếu cụ thể (n). git reset --soft HEAD~1 quay lại commit gần nhất.

  • git reset --soft <commit ID> lùi về head có <commit ID>.

Hãy xem một vài ví dụ.

git add data_acquisition.py data_preprocessing.py

git commit -m "added data acquisition and preprocessing scripts"

Đây là kết quả của lệnh trước.

[master (root-commit) faf864e] added data acquisition and preprocessing scripts
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_acquisition.py
create mode 100644 data_preprocessing.py

Ta có thể kiểm tra trạng thái commit như sau:

git status

On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
model_training.py

nothing added to commit but untracked files present (use "git add" to track)

Nhưng ta đã quên thêm tệp model_training.py vào commit.

Vì commit cuối cùng ở HEAD, ta có thể khắc phục bằng cách chạy ba câu lệnh sau.

  • Hoàn tác commit cuối cùng nhưng giữ thay đổi ở trạng thái đã stage bằng git reset --soft HEAD~1.

  • Thêm tệp bị quên với git add.

  • Thực hiện commit cuối cùng với git commit.

git reset --soft HEAD~1

git add model_training.py

git commit -m "added all the python scripts"

Kết quả sau đây cho thấy git reset quay về master sau tất cả các bước trước đó:

[master (root-commit) faf864e] added all the python scripts
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_acquisition.py
create mode 100644 data_preprocessing.py
create mode 100644 model_training.py

Để xem hướng dẫn chi tiết hơn về soft reset, xem Git Reset Soft: Complete Guide. Nếu bạn chỉ cần sửa thông điệp commit cuối hoặc thêm các tệp bị quên, git commit --amend thường là lựa chọn nhanh hơn so với reset.

git reset --mixed

Đây là đối số mặc định cho git reset. Chạy lệnh này có hai tác động: (1) bỏ commit tất cả thay đổi và (2) bỏ stage chúng. Hãy tưởng tượng ta lỡ thêm tệp model_training.py, và muốn loại bỏ vì việc huấn luyện mô hình chưa xong. Cách thực hiện như sau:

  • Bỏ stage các tệp đã nằm trong commit bằng git reset HEAD
  • Chỉ thêm các tệp cần cho commit
git reset HEAD

git status

On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
model_training.py
data_acquisition.py
data_preprocessing.py

nothing added to commit but untracked files present (use "git add" to track)

Giờ ta có thể chỉ thêm hai tệp cuối để commit và thực hiện commit.

git add data_acquisition.py data_preprocessing.py

git commit -m "Removed the model_training.py from the commit"

git reset --hard

Tùy chọn này có thể nguy hiểm. Vì vậy, hãy thận trọng khi dùng!

Về cơ bản, khi dùng hard reset trên một commit cụ thể, nó buộc HEAD quay lại commit đó và xóa mọi thứ sau đó.

Trước khi chạy hard reset, hãy xem nội dung thư mục.

ls
data_acquisition.py data_preprocessing.py model_training.py

git reset --hard
HEAD is now at 97159bc added data acquisition and preprocessing scripts

Bây giờ hãy kiểm tra nội dung thư mục:

ls
data_acquisition.py data_preprocessing.py

Ta nhận thấy tệp chưa được theo dõi model_training.py đã bị xóa. Một lần nữa, hãy chắc chắn rằng bạn hiểu mình đang làm gì với lệnh reset vì hậu quả có thể rất nghiêm trọng!

Nếu bạn lỡ chạy hard reset, git reflog là phao cứu sinh. Git giữ nhật ký mọi thay đổi tham chiếu khoảng 30 ngày, vì vậy bạn thường có thể khôi phục các commit “mất” bằng cách chạy git reflog rồi git reset --hard HEAD@{n} để quay lại trạng thái trước khi reset. Lưu ý rằng các thay đổi chưa commit hoặc chưa stage không thể khôi phục theo cách này.

Git Revert

Sơ đồ Revert - Trước và Sau

Trước và Sau khi Revert (Nguồn)

Git revert tương tự git reset, nhưng cách tiếp cận hơi khác. Thay vì loại bỏ mọi commit trên đường đi, revert CHỈ hoàn tác một commit bằng cách đưa bạn trở lại trạng thái đã stage trước commit đó.

Vì vậy, thay vì xóa commit, git revert đảo ngược các thay đổi do commit gốc giới thiệu bằng cách tạo một commit mới với nội dung đảo ngược. Đây là cách an toàn để thu hồi một commit vì bạn không mất lịch sử.

Cần lưu ý rằng revert sẽ không có tác dụng trừ khi chỉ định hash hoặc tham chiếu của commit.

Hãy khám phá một vài tùy chọn git revert thường gặp.

git revert --no-edit <commit ID>

Tùy chọn --no-edit cho phép bạn không thay đổi thông điệp dùng cho commit mà bạn định revert, và điều này sẽ khiến git revert ghi vào nhánh master.

Để minh họa, hãy tạo hai tệp mới để thêm vào.

touch model_monitoring.py data_monitoring.py

Sau khi tạo các tệp đó, ta cần thêm chúng vào khu vực staging của phiên bản đã chỉnh sửa.

git add model_monitoring.py

Trước khi tiếp tục, hãy xem trạng thái bằng cách chạy lệnh sau.

git status
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file:   data_monitoring.py
new file:   model_monitoring.py


Ta có thể thấy hai tệp đã được thêm, giờ có thể commit các thay đổi.

git commit -m "Added the monitoring script files"
[master (root-commit) eae84e7] Added the monitoring script files
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_monitoring.py
create mode 100644 model_monitoring.py


Sau đó, hash commit có thể được lấy qua lệnh sau. Điều này hữu ích khi bạn muốn thao tác với commit cụ thể đó.

git reflog
eae84e7 (HEAD -> master) HEAD@{0}: commit (initial): Added the monitoring script files

Bây giờ, giả sử commit trước là vô tình và ta muốn loại bỏ nó.

git revert --no-edit eae84e7

[master c61ef6b] Revert "Added the monitoring script files"
Date: Sat Nov 12 20:14:17 2022 -0600
2 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 data_monitoring.py
delete mode 100644 model_monitoring.py

Hãy xem log các commit:

git log

commit c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 (HEAD -> master)
Author: Zoumana Keita <keitnekozou@gmail.com>
Date:   Sat Nov 12 20:14:17 2022 -0600

  Revert "Added the monitoring script files"
 
  This reverts commit eae84e7669af733ee6c1b854f2fcd9acfea9d4a3.

commit eae84e7669af733ee6c1b854f2fcd9acfea9d4a3
Author: Zoumana Keita <keitnekozou@gmail.com>
Date:   Sat Nov 12 20:05:57 2022 -0600

  Added the monitoring script files

Từ log, ta thấy một commit mới đã được tạo với ID c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 để đảo ngược commit gốc có ID eae84e7669af733ee6c1b854f2fcd9acfea9d4a3.

Trong ví dụ này, vì chỉ có một commit, ta có thể dùng git revert HEAD, hiệu quả tương tự. Để có thêm ví dụ, xem hướng dẫn hoàn tác commit cuối.

git revert <commit hash>

Lệnh này chỉ loại bỏ các thay đổi gắn với commit hash đó và không ảnh hưởng đến commit khác.

Theo ID đã tạo trước đó, bạn nghĩ revert commit nào sẽ có hiệu lực?

Nếu câu trả lời của bạn là c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 thì đúng. Còn eae84e7669af733ee6c1b854f2fcd9acfea9d4a3 sẽ không có tác dụng, vì nó đã bị thay thế bởi commit mới.

Hãy xem điều gì xảy ra khi cố gắng thực hiện revert.

git revert c61ef6b4e86f41f47c8c77de3b5fca3945a7c075

[master aaead40] Revert "Revert "Added the monitoring script files""

 2 files changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 data_monitoring.py

 create mode 100644 model_monitoring.py

Như bạn thấy, hai tệp ban đầu được tạo và commit đã quay trở lại!

git revert --no-commit <commit ID>

Mục đích của tùy chọn --no-commit hoặc -n là ngăn git tự động tạo commit cho thao tác revert. Điều này hữu ích nếu bạn muốn xem lại các thay đổi do câu lệnh revert tạo ra trước khi commit chúng.

Hãy xét ví dụ sau:

git revert --no-commit c61ef6b4e86f41f47c8c77de3b5fca3945a7c075

Lệnh này sẽ hoàn tác các thay đổi do commit có ID c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 tạo ra nhưng sẽ không tự động tạo commit mới để ghi nhận việc revert. Thay vào đó, nó sẽ stage các thay đổi đảo ngược để bạn có thể xem xét và quyết định có commit thủ công hay không.

Git Revert và Reset

git reset và git revert đều hoàn tác thay đổi, nhưng hoạt động khác nhau và phù hợp với các tình huống khác nhau.

Tiêu chí git reset git revert
Cách hoạt động Di chuyển con trỏ nhánh lùi lại, loại bỏ các commit khỏi lịch sử Tạo commit mới đảo ngược thay đổi của commit trước
Lịch sử commit Viết lại lịch sử (các commit bị loại bỏ) Bảo toàn toàn bộ lịch sử (thêm commit revert mới)
An toàn cho nhánh dùng chung? Không (cộng tác viên sẽ xung đột nếu họ đã kéo các commit bị xóa) Có (lịch sử nhất quán cho mọi cộng tác viên)
Phạm vi Có thể hoàn tác nhiều commit cùng lúc Hoàn tác từng commit một (dùng --no-commit để gom nhóm)
Tình huống phù hợp nhất Dọn dẹp nhánh cục bộ hoặc riêng tư trước khi đẩy lên Hoàn tác các thay đổi đã đẩy lên remote
Mức độ rủi ro Cao với --hard (xóa vĩnh viễn công việc chưa commit) Thấp (không bao giờ mất dữ liệu)

Nguyên tắc chung: dùng git reset để dọn dẹp lịch sử cục bộ chưa đẩy, và git revert để an toàn hoàn tác bất cứ điều gì người khác có thể đã kéo về. Với các trường hợp revert merge commit, xem hướng dẫn Git Revert Merge Commit của chúng tôi.

Kết luận

Điểm mấu chốt: dùng git reset để dọn dẹp lịch sử cục bộ bạn chưa đẩy, và git revert để an toàn hoàn tác thay đổi trên các nhánh dùng chung. Hãy đặc biệt cẩn thận với git reset --hard, vì nó sẽ xóa vĩnh viễn các thay đổi chưa commit khỏi thư mục làm việc.

Để tiếp tục nâng cao kỹ năng Git, hãy xem thêm các hướng dẫn liên quan từ DataCamp:

Câu hỏi thường gặp về Git Reset và Revert

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

git reset dùng để hoàn tác các commit trong kho cục bộ bằng cách di chuyển con trỏ nhánh về một commit trước đó, qua đó loại bỏ các commit được tạo sau thời điểm ấy. git revert, ngược lại, dùng để hoàn tác các thay đổi đã được commit vào kho bằng cách tạo một commit mới đảo ngược các thay đổi của commit cụ thể đó.

Bạn có nên dùng git reset hard không?

Hãy thận trọng khi dùng git reset hard vì nó có thể xóa sạch mọi thay đổi và loại bỏ chúng khỏi thư mục cục bộ. Trước khi dùng, hãy chắc chắn 100% về những gì bạn đang làm.

Khi nào tôi nên dùng git reset?

git reset hữu ích khi bạn muốn hoàn tác các commit chưa được đẩy lên kho từ xa (remote). Nó có thể dùng để loại bỏ các commit chứa sai sót hoặc không còn cần thiết.

Cần lưu ý git reset là thao tác cục bộ và không ảnh hưởng đến kho từ xa. Nếu bạn đã đẩy các commit muốn hoàn tác, hãy dùng git revert thay vì reset.

Khi nào tôi nên dùng git revert?

git revert hữu ích khi bạn muốn hoàn tác các commit đã được đẩy lên kho từ xa. Đây là lựa chọn an toàn vì nó không xóa commit nào và để lại bản ghi rõ ràng về các thay đổi trong kho.

Cần lưu ý git revert chỉ có thể hoàn tác các commit chưa được hợp nhất vào nhánh khác. Nếu bạn muốn hoàn tác các commit là một phần của nhánh đã được merge, bạn nên dùng git reset hoặc phương pháp khác để loại bỏ commit.

Git reset là gì?

git reset dùng để hoàn tác thay đổi trong lịch sử commit hoặc trong thư mục làm việc. Nó cho phép bạn đặt lại HEAD về một commit cụ thể, và tùy chọn sửa đổi chỉ mục (khu vực staging) và thư mục làm việc.

Sự khác nhau giữa --soft, --mixed và --hard trong git reset là gì?

--soft: Di chuyển HEAD về commit chỉ định nhưng giữ thay đổi ở trạng thái đã stage. --mixed (mặc định): Di chuyển HEAD về commit chỉ định và bỏ stage các thay đổi (giữ nguyên thư mục làm việc). --hard: Di chuyển HEAD về commit chỉ định và loại bỏ mọi thay đổi trong chỉ mục và thư mục làm việc.

Chủ đề
Git
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm