Git Bisect
Cập nhật lần cuối
git bisect tìm ra commit gây ra bug bằng tìm kiếm nhị phân (binary search). Bạn cho nó biết một commit chắc chắn tốt và một commit chắc chắn lỗi; Git checkout một commit ở giữa, bạn đánh dấu commit đó tốt hay lỗi, và mỗi lần như vậy phạm vi tìm kiếm thu hẹp một nửa. Nhờ đó chỉ sau vài bước là tìm ra thủ phạm, kể cả khi có hàng nghìn commit.
Thử các lệnh này trong playground terminal: một shell thật ngay trên trình duyệt, không cần cài đặt gì.
Cú pháp
| Lệnh | Tác dụng |
|---|---|
git bisect start | Bắt đầu một phiên bisect |
git bisect bad | Đánh dấu commit hiện tại là lỗi |
git bisect good <hash> | Đánh dấu một commit chắc chắn tốt |
git bisect good / git bisect bad | Đánh dấu từng commit đã kiểm tra |
git bisect run ./test.sh | Tự động hóa: chạy test để đánh dấu từng bước |
git bisect reset | Kết thúc bisect, quay về nhánh của bạn |
Ví dụ minh họa
Tìm commit đã làm hỏng bản build.
| Bước | Lệnh | Kết quả |
|---|---|---|
| 1 | git bisect start | Bắt đầu tìm kiếm |
| 2 | git bisect bad | Commit hiện tại bị lỗi |
| 3 | git bisect good v1.0 | Tag cũ này vẫn chạy tốt |
| 4 | Kiểm tra, rồi good/bad | Lặp lại cho đến khi Git chỉ ra commit |
Câu hỏi thường gặp về git bisect
git bisect dùng để làm gì?
Lệnh này tìm kiếm nhị phân trong lịch sử commit để tìm đúng commit đã gây ra bug. Bạn đánh dấu một commit tốt và một commit lỗi; Git liên tục checkout commit ở giữa để bạn kiểm tra, mỗi lần chia đôi phạm vi tìm kiếm, cho đến khi xác định được commit lỗi đầu tiên.
Cách dùng git bisect thế nào?
git bisect start, đánh dấu trạng thái lỗi hiện tại bằng git bisect bad và một commit chạy tốt bằng git bisect good <hash>. Git checkout một commit ở giữa; bạn kiểm tra rồi chạy git bisect good hoặc git bisect bad. Lặp lại cho đến khi Git báo commit lỗi đầu tiên, sau đó chạy git bisect reset.Có thể tự động hóa git bisect không?
git bisect run <script> chạy script của bạn ở mỗi bước; script cần thoát với mã 0 khi commit tốt và mã khác 0 khi commit lỗi (các trình chạy test làm việc này rất tốt). Git sẽ tự bisect mà bạn không phải đánh dấu từng commit bằng tay, và in ra commit gây lỗi ở cuối.Làm sao để kết thúc bisect?
git bisect reset để kết thúc phiên và quay về nhánh cùng commit bạn đang ở trước khi bắt đầu. Hãy chạy lệnh này dù có tìm được commit lỗi hay không, vì nó dọn dẹp trạng thái bisect tạm thời.Có thể luyện tập lệnh này online không?
git bisect trong một shell thật ngay trên trình duyệt, không cần cài đặt gì. Khóa học Git tương tác miễn phí của Coddy cũng hướng dẫn cách xem lại lịch sử từng bước.