Git Bisect: คู่มือการหาคอมมิตที่ทำให้เกิดบั๊ก
Git Bisect คืออะไร?
git bisect เป็นคำสั่งใน Git ที่ช่วยให้คุณหาคอมมิตที่ทำให้เกิดบั๊กหรือปัญหาต่าง ๆ ได้อย่างรวดเร็ว โดยใช้การค้นหาลำดับแบบไบนารี (binary search) เพื่อลดจำนวนคอมมิตที่ต้องตรวจสอบ ทำให้การหาปัญหานั้นมีประสิทธิภาพและรวดเร็ว
วิธีการทำงานของ Git Bisect
- กำหนดคอมมิต "ดี" (good commit): คอมมิตที่บั๊กยังไม่เกิด
- กำหนดคอมมิต "เสีย" (bad commit): คอมมิตที่บั๊กเกิดขึ้นแล้ว
- Git จะช่วยทำการบิสเซ็กต์ (bisect) คอมมิต: Git จะเช็คเอาท์คอมมิตที่อยู่กลางระหว่างคอมมิตดีและคอมมิตเสียและให้คุณทดสอบ
- ทดสอบคอมมิต: ถ้าบั๊กเกิดในคอมมิตนี้ ให้ทำการกำหนดเป็น "เสีย" ถ้าไม่เกิด ให้กำหนดเป็น "ดี"
- ทำซ้ำขั้นตอนนี้: Git จะช่วยหาคอมมิตที่มีปัญหาจนกว่าจะพบคอมมิตที่ทำให้เกิดบั๊ก
ขั้นตอนการใช้ Git Bisect
-
เริ่มใช้งาน Git Bisect
รันคำสั่งนี้เพื่อเริ่มต้นกระบวนการบิสเซ็กต์:
git bisect start -
กำหนดคอมมิต "เสีย" (bad commit)
คอมมิต "เสีย" คือคอมมิตที่มีบั๊กเกิดขึ้น คุณสามารถกำหนดคอมมิตปัจจุบันเป็น "เสีย" ได้ด้วยคำสั่ง:
git bisect bad -
กำหนดคอมมิต "ดี" (good commit)
คอมมิต "ดี" คือคอมมิตที่บั๊กยังไม่เกิดขึ้น คุณสามารถระบุคอมมิตแฮชหรือชื่อบรานช์ที่รู้ว่าไม่มีบั๊ก เช่น:
git bisect good <good_commit_hash> -
ทดสอบคอมมิต
หลังจากกำหนดคอมมิต "ดี" และ "เสีย" แล้ว Git จะเช็คเอาท์คอมมิตที่อยู่ตรงกลางให้คุณทดสอบ หากบั๊กเกิดขึ้นในคอมมิตนี้ ให้กำหนดเป็น "เสีย":
git bisect badหากบั๊กไม่เกิด ให้กำหนดเป็น "ดี":
git bisect good -
ทำซ้ำกระบวนการ
Git จะช่วยจำกัดขอบเขตของคอมมิตที่มีปัญหาต่อไป โดยการทดสอบคอมมิตและกำหนดเป็น "ดี" หรือ "เสีย" จนกระทั่ง Git พบคอมมิตที่ทำให้เกิดบั๊ก
-
จบการใช้งาน Bisect
เมื่อ Git ค้นพบคอมมิตที่ทำให้เกิดปัญหาแล้ว มันจะแสดงแฮชของคอมมิตและรายละเอียดที่เกี่ยวข้อง คุณสามารถหยุดการบิสเซ็กต์ด้วยคำสั่ง:
git bisect reset
ตัวอย่าง
$ git bisect start
$ git bisect bad
$ git bisect good <commit_hash_of_a_known_good_commit>
Git จะเช็คเอาท์คอมมิตที่อยู่ตรงกลางให้คุณทดสอบ คุณสามารถทำซ้ำขั้นตอนการกำหนดคอมมิตเป็น good หรือ bad จนกว่าจะพบคอมมิตที่ทำให้เกิดปัญหา จากนั้นใช้คำสั่ง git bisect reset เพื่อกลับไปยังบรานช์เดิม
สรุป
git bisect เป็นเครื่องมือที่มีประสิทธิภาพในการหาคอมมิตที่ทำให้เกิดบั๊ก โดยการจำกัดขอบเขตของคอมมิตที่ต้องทดสอบ ทำให้ช่วยประหยัดเวลาในการดีบักโค้ดของคุณ