Cho tới giờ chúng ta đã xem kịch bản lý tưởng: bạn viết code, commit, tạo Pull Request. Nhưng trong thực tế thường có chuyện không như ý: bạn có thể mắc lỗi trong code, commit với thông điệp sai hoặc đơn giản nhận ra mình đi sai hướng. Trong bài giảng này chúng ta sẽ phân tích cách giải quyết các vấn đề phổ biến nhất.
1. Rollback — hoàn tác thay đổi trước commit
Kịch bản: bạn đã thay đổi file, nhưng nhận ra rằng tất cả chỉnh sửa của bạn là sai và muốn nhanh chóng đưa file về trạng thái như sau commit gần nhất.
Sử dụng chức năng Rollback:
- Mở tab
Commit. - Tìm trong danh sách file đã thay đổi mà bạn muốn "rollback".
- Nhấp chuột phải lên file đó và chọn
Rollback.
IDE sẽ cảnh báo rằng các thay đổi sẽ bị mất. Đồng ý, và file sẽ lập tức quay về phiên bản được lưu gần nhất trong Git. Đây là cách đơn giản và an toàn nhất để hoàn tác thay đổi local.
2. Reset — xóa các commit local
Kịch bản: bạn đã thực hiện một hoặc vài commit, nhưng chưa push. Bạn nhận ra những commit đó là sai và muốn xóa hoàn toàn chúng như thể chưa từng tồn tại.
Sử dụng chức năng Reset:
- Mở tab
Git -> Logđể xem lịch sử commit. - Tìm commit "tốt" cuối cùng mà bạn muốn quay về (commit trước các commit sai).
- Nhấp chuột phải lên commit đó và chọn
Reset Current Branch to Here....
Trong cửa sổ mở ra bạn sẽ được yêu cầu chọn chế độ reset. Mạnh nhất là Hard.
Chú ý! Chế độ Hard xóa vĩnh viễn tất cả commit sau commit được chọn, cũng như tất cả thay đổi trong mã nằm trong những commit đó. Hãy dùng nó cực kỳ thận trọng và chỉ với những commit chưa ai thấy (những commit chưa được gửi lên GitHub).
3. Phải làm gì sau khi Push?
Kịch bản: bạn đã thực hiện push, và chỉ sau đó phát hiện ra có lỗi trong đó.
Khi commit đã lên server từ xa, nó trở thành một phần của lịch sử chung của dự án. Cố gắng viết lại lịch sử này có thể gây ra rắc rối lớn cho đồng đội. Hãy tưởng tượng họ đã tải về thay đổi của bạn và bắt đầu làm việc dựa trên đó.
Giải pháp đúng và an toàn:
Chỉ cần tạo một commit mới để sửa lỗi và gửi nó đi. Đây là thực hành hoàn toàn bình thường. Bằng cách đó, lịch sử vẫn trung thực và dễ hiểu cho mọi người.
4. Nhìn lại quá khứ: làm việc nâng cao với log
Chúng ta đã biết tab Git -> Log, nhưng đó không chỉ là danh sách commit, mà là công cụ mạnh để điều tra.
- Hash của commit (Commit Hash): bạn chắc hẳn đã thấy trong log một chuỗi chữ và số, ví dụ
a1b2c3d. Hash này là duy nhất, nó cho phép tham chiếu chính xác tới bất kỳ điểm nào trong lịch sử dự án. Bạn hiếm khi cần dùng nó thủ công, nhưng quan trọng là biết đó là định danh duy nhất cho mỗi "snapshot" code.![]()
- Bạn có thể lọc lịch sử theo branch, author, date hoặc thậm chí theo từ trong message của commit. Điều này giúp nhanh chóng tìm ra ai và khi nào đã làm việc trên phần chức năng cụ thể.
- Muốn tìm commit mà trong đó một dòng code cụ thể được thêm hoặc xóa? Trong cửa sổ
Logcó ô tìm kiếm, nó tìm không chỉ theo message mà còn theo nội dung của chính các thay đổi. - Nhấp chuột phải vào lề của editor và chọn
Annotate with Git Blame. IDE sẽ hiển thị bên cạnh mỗi dòng ai và trong commit nào lần cuối thay đổi nó. Điều này cực kỳ hữu ích để hiểu vì sao code được viết như vậy.
5. Vùng nguy hiểm: Force Push
Vậy là chúng ta đã khẳng định việc thay đổi các commit đã gửi đi — là ý tưởng tồi. Nhưng nếu bạn vẫn thay đổi lịch sử local của mình (ví dụ bằng Reset) và giờ nó không khớp với lịch sử trên server? Khi cố push bình thường, Git sẽ báo lỗi để bảo vệ lịch sử chung khỏi bị ghi đè.
Trong những trường hợp như vậy có tuỳ chọn — force push (push bắt buộc). Lệnh này bảo server: "Quên mọi thứ trước đây. Lịch sử local của tôi mới là đúng. Thay lịch sử của bạn bằng của tôi".
CẢNH BÁO! Trong 99% trường hợp, dùng force push trong dự án nhóm là một thảm họa. Nó có thể xóa vĩnh viễn các commit mà đồng đội bạn đã tải về và đang làm việc trên đó. Điều này giống như xé bỏ trang trong cuốn sách chung của thư viện và dán trang của bạn vào.
Khi tuyệt đối KHÔNG dùng force push:
- Trên bất kỳ branch chung nào:
main,develop,master. Không bao giờ. - Trên bất kỳ branch nào mà có người khác ngoài bạn đang làm việc.
Kịch bản duy nhất chấp nhận được:
Bạn đang làm việc trên feature-branch cá nhân của bạn, mà chưa ai thấy hoặc dùng. Bạn đã làm vài commit "bẩn", push chúng lên server, rồi quyết định "chải" lại bằng Reset. Trong trường hợp này bạn có thể dùng force push để cập nhật branch của mình trên server trước khi tạo Pull Request.
Trong IDE tuỳ chọn này thường ẩn sau nút Push. Các nhà phát triển IDE làm vậy có chủ ý để bạn không bấm nhầm.
Nếu bạn không chắc 100% về những gì mình đang làm — đừng dùng force push. An toàn hơn là tạo commit mới với các sửa lỗi.
6. Cập nhật dự án
Luôn nhấn Update Project trên branch main trước khi bắt đầu nhiệm vụ mới. Điều này giúp bạn tránh nhiều xung đột merge trong tương lai và đảm bảo bạn bắt đầu làm việc từ phiên bản code mới nhất.

GO TO FULL VERSION