Menu
CoddyTech

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ì.

git bisect tìm kiếm nhị phân trong lịch sử giữa một commit tốt và một commit lỗi, mỗi bước thu hẹp phạm vi nghi vấn còn một nửa.

Cú pháp

LệnhTác dụng
git bisect startBắ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.shTự động hóa: chạy test để đánh dấu từng bước
git bisect resetKế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ướcLệnhKết quả
1git bisect startBắt đầu tìm kiếm
2git bisect badCommit hiện tại bị lỗi
3git bisect good v1.0Tag cũ này vẫn chạy tốt
4Kiểm tra, rồi good/badLặ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?
Chạy 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?
Có. 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?
Chạy 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?
Có. Mở playground terminal để chạy 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.
Hình minh họa các ngôn ngữ lập trình của Coddy

Học Git cùng Coddy

Bắt đầu