Đừng để commit thành một “nồi lẩu thập cẩm”
Kịch bản quen thuộc: Bạn đang fix một bug logic nghiêm trọng thì thấy vài dòng code bên cạnh “ngứa mắt” nên tiện tay refactor luôn. Sau đó, bạn viết thêm vài dòng comment và xóa bớt mấy lệnh console.log thừa. Nhìn lại git status, một file duy nhất đã biến đổi 100 dòng với 3 mục đích hoàn toàn khác nhau.
Nếu bạn dùng git add . rồi commit với nội dung “Fix bug and refactor”, bạn đang tự làm khó mình. Người review code (hoặc chính bạn vài tháng sau) sẽ phải bơi trong đống thay đổi hỗn độn đó để tìm xem đâu là logic fix bug chính. Gộp chung mọi thứ vào một commit khiến việc truy vết lỗi trở thành ác mộng.
git add -p (viết tắt của –patch) là giải pháp cứu bồ trong trường hợp này. Lệnh này cho phép bạn soi từng thay đổi nhỏ (hunk) và quyết định có đưa nó vào khu vực chờ (staging area) hay không. Hãy cùng mình dọn dẹp đống code này thật chuyên nghiệp nhé.
Bắt đầu nhanh: Làm chủ git add -p sau 5 phút
Giả sử file app.py vừa được sửa cả logic tính tiền lẫn format hiển thị. Thay vì add cả file, hãy gõ lệnh:
git add -p app.py
Git sẽ chia nhỏ file thành từng đoạn code thay đổi (gọi là một hunk) và hỏi bạn muốn xử lý thế nào:
Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]?
Đừng để đống ký tự kia làm bạn rối. Thực tế, bạn chỉ cần nhớ 4 phím cơ bản là đủ dùng cho 90% trường hợp:
- y (yes): Đồng ý đưa đoạn này vào commit hiện tại.
- n (no): Bỏ qua đoạn này để dành cho commit sau.
- s (split): Nếu hunk hiện tại vẫn chứa cả code fix bug lẫn refactor, nhấn
sđể chia nhỏ nó ra thêm nữa. - q (quit): Thoát, không add thêm gì nữa.
Sau khi chọn xong, hãy commit phần đã chọn bằng git commit -m "Fix: logic tính thuế VAT". Những phần bạn nhấn n vẫn sẽ nằm lại ở trạng thái unstaged, sẵn sàng để bạn commit riêng với nội dung khác.
Các tùy chọn nâng cao giúp bạn thao tác nhanh hơn
Khi đã quen tay với y/n/s, bạn có thể tăng tốc độ xử lý các file lớn hàng nghìn dòng bằng các phím điều hướng:
1. Chia nhỏ triệt để với phím ‘s’
Git tự động nhóm các dòng thay đổi gần nhau vào một hunk. Nếu trong 10 dòng đó có 5 dòng fix bug và 5 dòng thêm comment, phím s sẽ cố gắng tách chúng ra dựa trên các dòng không thay đổi ở giữa.
2. Điều hướng thông minh (j, J, g)
- j: Tạm để hunk này ở trạng thái chưa quyết định và nhảy sang hunk tiếp theo.
- k: Quay lại xem hunk phía trước.
- g: Nhảy nhanh đến một hunk cụ thể trong danh sách.
3. Quyết định hàng loạt (a, d)
- a (all): Stage toàn bộ hunk này và tất cả các hunk còn lại trong file.
- d (don’t): Bỏ qua hunk này và toàn bộ phần còn lại của file.
Chế độ “Edit”: Chỉnh sửa từng ký tự bằng phím ‘e’
Đôi khi lệnh s (split) không thể chia nhỏ code như ý muốn, ví dụ khi hai thay đổi nằm sát vách nhau. Lúc này, hãy nhấn e (edit) để can thiệp thủ công.
Git sẽ mở trình soạn thảo (Vim hoặc Nano). Bạn sẽ thấy các dòng bắt đầu bằng + (thêm mới) và - (xóa đi).
- Muốn bỏ một dòng thêm mới khỏi commit này? Hãy xóa dòng đó đi.
- Muốn giữ lại một dòng vốn định xóa? Hãy thay dấu
-bằng một khoảng trắng.
Lưu ý quan trọng: Đừng thay đổi nội dung code khi đang ở chế độ này. Bạn chỉ nên xóa dòng hoặc đổi ký tự đầu dòng để tránh lỗi “patch does not apply”.
Tại sao đây là thói quen của một Senior?
Trong một dự án thực tế, một Pull Request (PR) chứa 500 dòng code hỗn độn sẽ khiến đồng nghiệp mất cả tiếng để review. Nếu bạn tách thành 5 commit nhỏ, mỗi commit 100 dòng tập trung vào một vấn đề, thời gian review có thể giảm xuống 30%.
Dùng git add -p mang lại 3 lợi ích thực tế:
- Tự review chính mình: Bạn buộc phải nhìn lại từng dòng code. Đây là lúc bạn phát hiện ra các biến thừa hoặc lệnh
print(data)còn sót lại. - Atomic Commits: Mỗi commit chỉ giải quyết đúng một việc. Nếu đoạn code refactor gây lỗi, bạn có thể
git revertnó mà không làm mất đoạn fix bug quan trọng. - Debug siêu tốc với Git Bisect: Việc chia nhỏ commit giúp lệnh
bisecttìm ra chính xác dòng code gây lỗi nhanh hơn gấp nhiều lần.
Mẹo phối hợp cùng các lệnh Git khác
Kiểm tra lần cuối với git commit -v
Sau khi stage xong, hãy thử dùng lệnh:
git commit -v
Lệnh này hiển thị toàn bộ nội dung code bạn sắp commit ngay bên dưới cửa sổ viết message. Nó giúp bạn chắc chắn 100% không có “rác” lọt vào lịch sử dự án.
Xóa bỏ thay đổi rác (git checkout -p)
Nếu bạn muốn xóa một vài đoạn code thử nghiệm nhưng vẫn muốn giữ lại những phần khác trong cùng một file, hãy dùng:
git checkout -p filename.py
Cơ chế y hệt git add -p, nhưng thay vì chọn để stage, bạn chọn y để discard (hủy bỏ) đoạn code đó. File của bạn sẽ sạch sẽ ngay lập tức.
Kết luận
Học git add -p có thể khiến bạn thấy chậm lại một chút trong vài ngày đầu. Tuy nhiên, về lâu dài, nó xây dựng tư duy làm việc chỉn chu và chuyên nghiệp. Đừng chỉ là một coder biết viết code chạy được, hãy là một kỹ sư biết quản lý mã nguồn một cách nghệ thuật.

