Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Một chức năng đang chạy tốt tuần trước bỗng hỏng, mà từ đó có hàng chục commit của nhiều người. Hoặc bạn thấy một đoạn code kỳ lạ và muốn biết tại sao nó lại ở đó. Git có sẵn hai công cụ rất mạnh cho các tình huống này: git blame và git bisect. Bài này hướng dẫn cách dùng hiệu quả.
Dù tên gọi nghe như "đổ lỗi", mục đích thực sự của git blame là tìm ngữ cảnh: dòng code này xuất hiện trong commit nào, do ai, kèm thông điệp gì. Từ đó bạn hiểu lý do thay vì đoán.
git blame src/order.js^a1b2c3d (An 2025-01-10 1) function calculateTotal(items) {7f8e9d0e (Bình 2025-02-14 2) if (items.length === 0) return 0;3c4d5e6f (An 2025-02-20 3) return items.reduce(...);}Mỗi dòng đi kèm mã commit, tác giả và ngày. Từ mã commit, xem chi tiết bằng:
git show 7f8e9d0eBạn sẽ đọc được toàn bộ thay đổi và thông điệp commit giải thích lý do thêm dòng kiểm tra rỗng.
git blame -L 10,30 src/order.js chỉ hiện dòng 10 đến 30.-w để commit chỉ chỉnh định dạng không che mất tác giả thật.-M (di chuyển trong file) và -C (từ file khác).--ignore-revs-file .git-blame-ignore-revs.Và hãy nhớ mục tiêu là hiểu lý do, không phải tìm người để trách. Nhiều dòng code "kỳ lạ" chỉ là hệ quả của yêu cầu thay đổi hoặc ràng buộc lúc đó.
# Lịch sử của một filegit log --oneline -- src/order.js# Lịch sử của một hàm hoặc dòng cụ thểgit log -L :calculateTotal:src/order.js# Tìm commit có thay đổi liên quan tới một chuỗigit log -S"calculateTotal" --onelineTùy chọn -S (còn gọi "pickaxe") rất hữu ích để tìm commit thêm hoặc xóa một chuỗi cụ thể, ví dụ khi bạn muốn biết khi nào một hàm bị xóa.
Khi biết rằng "bản cũ chạy đúng, bản hiện tại bị lỗi" nhưng không biết commit nào gây ra, bisect giúp bạn khoanh vùng nhanh. Nó dùng thuật toán tìm kiếm nhị phân: chia đôi khoảng commit nghi ngờ, bạn kiểm tra bản ở giữa tốt hay xấu, rồi tiếp tục chia đôi. Với 1000 commit, chỉ cần khoảng 10 lần kiểm tra.
git bisect startgit bisect badgit bisect good v1.2.0 (hoặc mã commit)git bisect good nếu chạy đúng hoặc git bisect bad nếu còn lỗi.git bisect resetNếu bạn có thể viết một lệnh trả về mã 0 khi đúng và khác 0 khi sai (một test chẳng hạn), Git tự động làm hết:
git bisect start HEAD v1.2.0git bisect run npm test -- --testNamePattern="calculateTotal"Git sẽ tự checkout, chạy lệnh, phân loại và chia đôi cho tới khi tìm ra commit thủ phạm. Đây là cách cực kỳ hiệu quả khi có test tái hiện lỗi. Có thể viết test mới chỉ để tái hiện lỗi và dùng nó với bisect.
git bisect skip để bỏ qua.git show của commit đó để hiểu thay đổi.Lịch sử Git là kho thông tin quý giá nếu bạn biết khai thác. git blame cho bạn ngữ cảnh của từng dòng, git bisect giúp tìm ra commit gây lỗi trong vài bước thay vì đọc cả trăm commit. Hãy thử bisect trên một repo cá nhân để làm quen trước khi cần dùng thật.
Nếu bạn muốn luyện Git và kỹ năng debug cho dự án nhóm, hãy ghé qua codebem.com để chọn khóa học phù hợp.
Nguyễn Đình Cường
0 comment