Hướng dẫn Git UNDO: Cách "Phục Hồi" và Viết Lại Lịch Sử Commit Một Cách Tự Tin

21 tháng 4, 2026·6 phút đọc

Bài viết này sẽ cung cấp kiến thức nền tảng và các công cụ thiết yếu trong Git như `git reset`, `git revert` và `git reflog`. Giúp bạn tự tin xử lý các lỗi sai khi quản lý mã nguồn mà không sợ làm hỏng dự án.

Hướng dẫn Git UNDO: Cách "Phục Hồi" và Viết Lại Lịch Sử Commit Một Cách Tự Tin

Nếu bạn từng hợp tác trong một dự án Machine Learning hoặc phát triển phần mềm — thực hiện rebase các nhánh feature, gộp các notebook thí nghiệm, hay dọn dẹp các commit trước khi tạo pull request — liệu bạn đã bao giờ rơi vào tình huống thốt lên: “Ôi không, mình vừa làm cái quái gì vậy?” chưa?

Đối với bất kỳ nhà khoa học dữ liệu hay lập trình viên nào làm việc theo nhóm, khả năng hoàn tác (undo) các hành động trong Git chính là kỹ năng cứu cánh. Bài viết này sẽ trang bị cho bạn những công cụ cần thiết để viết lại lịch sử Git một cách tự tin.

Cấu trúc 3 trạng thái của GitCấu trúc 3 trạng thái của Git

Hiểu về cách Git ghi lại thay đổi

Trước khi học cách undo, bạn cần hiểu Git ghi lại thay đổi như thế nào. Hãy tưởng tượng Git như một hệ thống ghi lại các snapshot (ảnh chụp nhanh) của hệ thống tệp theo thời gian. Một kho Git chứa ba “trạng thái” hoặc “cây” chính:

  1. Working directory (Thư mục làm việc): Nơi bạn thực sự sửa đổi các tệp.
  2. Index/Staging area (Khu vực lưu trữ tạm): Nơi chuẩn bị các tệp cho commit tiếp theo.
  3. Repository (Kho lưu trữ): Nơi chứa các commit đã được lưu.

Quy trình cơ bản là: Bạn sửa đổi code trong Working directory -> git add đưa file vào Index -> git commit lưu vào Repository.

Công cụ sửa đổi lịch sử: Git Reset

Để viết lại lịch sử, lệnh mạnh mẽ nhất bạn cần nắm vững là git reset. Lệnh này có 3 chế độ hoạt động chính dựa trên tùy chọn bạn sử dụng.

1. git reset --soft

Đây là hình thức undo "nhẹ nhàng" nhất. Nó hủy bỏ thao tác commit gần nhất nhưng giữ nguyên tất cả các thay đổi trong khu vực staging.

Ví dụ, sau khi commit, bạn nhận ra mình quên thêm một dòng chú thích. Hãy dùng:

git reset --soft HEAD~1

Lệnh này sẽ di chuyển nhánh hiện tại trỏ về commit trước đó (HEAD~1). Tuy nhiên, tệp bạn vừa commit vẫn nằm trong Index, sẵn sàng để bạn sửa đổi và commit lại.

2. git reset --mixed

Đây là chế độ mặc định của git reset. Nó không chỉ hủy commit mà còn hủy luôn thao tác staging (unstage).

git reset --mixed HEAD~1

Sau lệnh này, các thay đổi của commit cũ sẽ được đưa ra khỏi Index và quay trở lại Working directory. Bạn sẽ cần dùng git add lại nếu muốn commit chúng. Đây là cách tốt nhất khi bạn muốn cấu trúc lại commit của mình.

Minh họa các bước của Git ResetMinh họa các bước của Git Reset

3. git reset --hard

Đây là chế độ nguy hiểm nhất. Nó sẽ hủy commit, unstage các tệp và xóa luôn các thay đổi trong thư mục làm việc.

git reset --hard HEAD~1

Mọi thay đổi bạn vừa thực hiện sẽ biến mất hoàn toàn (trừ khi bạn có cách lấy lại). Hãy chỉ sử dụng lệnh này khi bạn chắc chắn mình muốn vứt bỏ toàn bộ công việc vừa làm.

Các tình huống thực tế (Scenarios)

Hãy xem xét cách áp dụng các kiến thức trên vào các tình huống "dở khóc dở cười" thường gặp.

Tình huống 1: Quên thay đổi gì đó trước khi commit

Bạn vừa commit tệp love.txt nhưng quên chưa thêm nội dung quan trọng.

Giải pháp: Sử dụng git reset --mixed HEAD~1 để hủy commit và đưa file về working directory. Sau đó, sửa file, git add lại và git commit lại với nội dung đầy đủ.

Tình huống 2: Commit nhầm vào nhánh main, chuyển sang feature branch

Bạn đang ở nhánh main nhưng commit mới này thực ra nên dành cho một nhánh tính năng mới.

Giải pháp:

  1. Dùng git reset --soft HEAD~1 để đưa commit ra khỏi main nhưng giữ trong staging.
  2. Tạo nhánh mới và chuyển tới đó: git switch -c feature.
  3. Commit lại: git commit -m "Thông điệp commit". Kết quả là commit mới nằm gọn trong nhánh feature còn main sạch bong.

Tình huống 3: Gộp quá nhiều thay đổi vào một commit

Bạn vừa sửa file A và file B rồi commit chung một chỗ. Giờ bạn muốn tách ra thành 2 commit riêng biệt.

Giải pháp: Sử dụng git reset --mixed HEAD~1. Bây giờ cả A và B đều ở working directory. Bạn hãy git add file A, commit A. Sau đó git add file B, commit B. Lịch sử giờ đã gọn gàng.

Tình huống 4: Dùng git cherry-pick để di chuyển commit giữa các nhánh

Bạn đã tạo một commit (giả sử gọi là "commit xanh") trên nhánh main, nhưng nó cần phải nằm ở một nhánh existing đã có sẵn.

Giải pháp:

  1. Chuyển sang nhánh existing: git switch existing.
  2. "Copy-paste" commit xanh từ main sang đây bằng git cherry-pick <SHA-commit-xanh>.
  3. Quay lại main và dùng git reset --hard HEAD~1 để xóa commit xanh khỏi đó (nếu cần).

Tình huống 5: Đã push code lên remote rồi mới phát hiện lỗi

Lúc này, dùng git reset là cực kỳ nguy hiểm vì nó sẽ làm thay đổi lịch sử công khai (remote history), gây xung đột cho đồng đội. Thay vào đó, hãy dùng git revert.

git revert HEAD

Lệnh này sẽ tạo ra một commit mới có nội dung hoàn toàn ngược lại với commit lỗi (ví dụ: nếu commit cũ thêm 3 dòng, revert sẽ xóa 3 dòng đó). Cách này giữ lịch sử liên tục và an toàn cho người khác.

Tình huống 6: Cứu cánh tuyệt đối với git reflog

Đây là tình huống đáng sợ nhất: Bạn lỡ tay gõ git reset --hard và xóa mất một commit chứa hàng giờ code quý giá. Liệu có lấy lại được?

Câu trả lời là CÓ, nhờ vào reflog.

Git giữ một nhật ký ghi lại mọi di chuyển của con trỏ HEAD, gọi là reflog. Ngay cả khi commit không còn hiện trong git log, nó vẫn nằm trong cơ sở dữ liệu của Git.

Cơ chế hoạt động của Git ReflogCơ chế hoạt động của Git Reflog

Bạn có thể xem lịch sử này bằng:

git reflog

Tìm thấy commit bị mất (ví dụ ở HEAD@{1}), bạn chỉ cần reset lại nó:

git reset --hard HEAD@{1}

Vậy là bạn đã cứu được ngày!

Kết luận

Hộp công cụ của bạn giờ đã có đầy đủ git reset, git cherry-pick, git revertgit reflog. Công cụ quan trọng nhất không phải là lệnh, mà là thói quen vẽ lại sơ đồ trạng thái hiện tại so với trạng thái mong muốn trước khi hành động.

Hiểu rõ cách Git hoạt động bên dưới sẽ giúp bạn tự tin xử lý mọi rắc rối, biến những cơn ác mộng về version control trở nên nhẹ nhàng như một buổi dạo chơi.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗