[Git Master] Giải mã "quyền năng" Git Reset: Khi nào nên quay đầu là bờ?
Chào anh em! Chắc hẳn trong lúc đang miệt mài "code dạo", không ít lần anh em rơi vào tình cảnh: lỡ tay commit code nháp, commit thừa file mật khẩu, hoặc nhận ra hướng tiếp cận hiện tại hoàn toàn sai lầm. Lúc này, phản xạ tự nhiên là: "Phải làm sao để quay lại lúc chưa commit?".
Trong Git, công cụ mạnh mẽ nhất (và cũng nguy hiểm nhất nếu dùng sai) chính là git reset. Hôm nay, hãy cùng mình "giải phẫu" lệnh git reset để anh em không bao giờ phải đổ mồ hôi hột khi lỡ tay commit nữa nhé!
1. Git Reset là gì?
Nói một cách dễ hiểu, git reset là lệnh cho phép anh em "di chuyển" HEAD (con trỏ hiện tại) về một commit bất kỳ trong lịch sử. Tùy vào "cấp độ" reset mà anh em chọn, Git sẽ quyết định số phận của các file đang nằm trong vùng Staging và Working Directory của anh em.
Có 3 chế độ "hủy diệt" mà anh em phải nắm lòng: --soft, --mixed (mặc định), và --hard.
2. Ba cấp độ "hủy diệt" - Chọn sao cho đúng?
Để dễ hình dung, hãy tưởng tượng commit của anh em là một cái "bưu kiện" vừa đóng gói xong
A. --soft (Chế độ nhẹ nhàng nhất)
-
Hành động: Di chuyển con trỏ `HEAD` về commit trước đó. -
Kết quả: Code của bạn vẫn nằm nguyên trong vùng Staged (xanh). -
Khi nào dùng: Khi bạn muốn gộp (squash) các commit lại với nhau hoặc muốn chỉnh sửa lại commit message trước khi push lên server. Bạn chỉ cần sửa xong và commit lại là xong.
B. --mixed (Chế độ mặc định)
- Hành động: Di chuyển con trỏ
HEADvề commit trước đó, đồng thời "bung" toàn bộ code từ vùng Staged ra vùng Unstaged (đỏ). - Kết quả: File không bị mất, vẫn nằm trên máy, nhưng ở trạng thái "chưa chuẩn bị" để commit.
- Khi nào dùng: Khi bạn nhận ra mình đã lỡ tay
git addnhầm hàng tá file không cần thiết và muốn "rã" commit đó ra để chọn lọc lại.
C. --hard (Chế độ "Reset sạch sành sanh")
- Hành động: Di chuyển con trỏ
HEAD, đồng thời XÓA SẠCH mọi thay đổi trong vùng Staged và Working Directory. Code của bạn sẽ quay về đúng trạng thái ở commit mà bạn reset tới. - Kết quả: Mọi thay đổi chưa được commit sẽ "bốc hơi".
- Khi nào dùng: Khi bạn nhận ra code của mình đã quá nát, không còn cách nào cứu chữa và muốn quay về trạng thái "trong sạch" ban đầu. Dùng xong lệnh này thì không có nút Undo đâu nhé!
3. Công thức thực chiến (Cheat Sheet)
Để ghi nhớ, anh em hãy nhìn vào bảng "quyền năng" này:
| Lệnh | Vùng Staged | Vùng Working Dir | Nội dung file |
|---|---|---|---|
| git reset --soft HEAD~1 | Giữ nguyên | Giữ nguyên | Không mất |
| git reset --mixed HEAD~1 | Bị xóa | Giữ nguyên | Không mất |
| git reset --hard HEAD~1 | Bị xóa | Bị xóa | Mất sạch! |
HEAD~1 nghĩa là quay lại 1 commit trước commit hiện tại.
4. Bí kíp "Cứu mạng" cho anh em Fork User
Nếu anh em dùng Fork, không cần gõ lệnh dòng lệnh, mọi thứ trực quan hơn nhiều:
- Dùng Reset trong Fork: Click chuột phải vào commit mà bạn muốn quay về, chọn Reset to here....
- Chọn chế độ: Fork sẽ hiện ra bảng chọn Soft/Mixed/Hard. Hãy chọn Soft nếu muốn an toàn nhất.
- Lỡ tay
hardreset mà mất code? Vẫn còn cứu được bằnggit reflog! Lệnh này giúp liệt kê lại toàn bộ các "di chuyển" của HEAD. Chỉ cần tìm lại mã commit trước khi reset vàreset --hardvề đó là cứu lại được toàn bộ code.
Lời khuyên của "người từng trải"
- Không bao giờ Reset trên nhánh Public (như develop hay master): Nếu bạn đã push commit lên server mà sau đó lại
reset --hard, người khác sẽ "hận" bạn vì lịch sử commit của cả team bị phá hỏng. Chỉ reset trên nhánhfeaturecủa cá nhân mình thôi nhé! - Luôn
git statustrước khi reset: Nhìn kỹ xem mình đang ở đâu, có bao nhiêu file đang trong vùng Staged. - Khi nghi ngờ, hãy tạo một nhánh mới: Nếu muốn reset nhưng sợ mất code, hãy
git checkout -b branch-backuptrước. Lúc đó bạn tha hồ reset mà không sợ mất "di sản".
Tổng kết
git reset là con dao hai lưỡi. Hiểu rõ ba chế độ --soft, --mixed, --hard sẽ biến anh em từ một "tay mơ" trở thành người làm chủ lịch sử Git của chính mình. Hãy dùng nó như một công cụ để dọn dẹp lịch sử commit gọn gàng, chuyên nghiệp.
Hy vọng bài viết này giúp anh em tự tin hơn khi "đối mặt" với những commit lỗi. Nếu thấy hữu ích, đừng quên 1 upvote để mình có động lực viết tiếp phần sau của series Git nhé! Chúc anh em code sạch, commit chuẩn!
All rights reserved