Git Bisect คืออะไร?
Git Bisect เป็นคำสั่งที่ช่วยให้คุณหา Commit ที่ทำให้เกิด Bug โดยใช้วิธี Binary Search ผ่าน Git History เมื่อมี Bug เกิดขึ้นแต่ไม่รู้ว่ามาจาก Commit ไหน Git Bisect จะช่วยให้คุณสามารถค้นหา Commit ที่เป็นสาเหตุได้อย่างรวดเร็วและมีประสิทธิภาพ โดยเฉพาะเมื่อมี Commits จำนวนมากในระหว่างช่วง Development บน VPS หรือ Server ของ Dot Enterprise
วิธีการทำงานของ Binary Search
Binary Search เป็นอัลกอริธึมที่ทำให้ Git Bisect มีประสิทธิภาพสูง แทนที่จะตรวจสอบแต่ละ Commit ทีละอัน Git Bisect จะแบ่ง Commits ออกเป็นสองส่วน และตรวจสอบส่วนกลาง ซ้ำกระบวนการนี้จนพบ Commit ที่ทำให้เกิด Bug
- แบ่ง Commits เป็นครึ่งหนึ่งทุกครั้ง
- ทดสอบว่า Commit นั้น “Good” (ไม่มี Bug) หรือ “Bad” (มี Bug)
- ซ้ำกระบวนการจนพบ Commit ที่เป็นสาเหตุ
- ประสิทธิภาพสูง: ใช้แค่ log₂(n) ครั้ง (เช่น 100 Commits ใช้แค่ 7 ครั้ง)
เริ่มใช้ Git Bisect
การเริ่มต้น Git Bisect นั้นง่ายมาก คุณเพียงแค่บอก Git ว่า Commit ปัจจุบันมี Bug และบอก Commit ที่ดี (ไม่มี Bug) ก็เพียงพอ
git bisect start
git bisect bad # Commit ปัจจุบันมี Bug
git bisect good v1.0.0 # Commit ที่ยังไม่มี Bug
ทดสอบแต่ละ Commit
Git Bisect จะ Checkout Commit ที่อยู่ตรงกลาง แล้วให้คุณทดสอบว่ามี Bug หรือไม่ ให้ข้อมูลกลับไปให้ Git ด้วยคำสั่ง git bisect good หรือ git bisect bad
npm test # ทดสอบ Commit นี้
git bisect good # Bug ไม่พบ ไปยัง Commit ถัดไป
git bisect bad # พบ Bug ไปยัง Commit ก่อนหน้า
ตัวอย่าง Workflow ของ Git Bisect
ลองทำตามตัวอย่างนี้เพื่อเข้าใจการทำงานของ Git Bisect อย่างชัดเจน
git bisect start
git bisect bad HEAD
git bisect good v1.0
# Git จะ Checkout ไปที่ Commit ตรงกลาง
# ครั้งที่ 1: ทดสอบดู
npm test
# ผลลัพธ์: Bug พบ
git bisect bad
# ครั้งที่ 2: ทดสอบ Commit ใหม่
npm test
# ผลลัพธ์: Bug ไม่พบ
git bisect good
# ครั้งที่ 3: ทดสอบต่อ
npm test
git bisect bad
# เมื่อพบ Commit ที่เป็นสาเหตุ
git bisect reset # ออกจาก Bisect Session
Automated Bisect ด้วย Test Script
เมื่อคุณมี Test Script ที่สามารถรันอัตโนมัติได้ Git Bisect สามารถทำงานโดยอัตโนมัติเช่นกัน ซึ่งจะประหยัดเวลามากในกรณีที่มี Commits จำนวนมาก โดยไม่ต้องให้ผู้ใช้มาทดสอบแต่ละครั้ง
git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect run npm test # ให้ Script ทำการ Test อัตโนมัติ
สร้าง Custom Bisect Script
คุณสามารถสร้าง Script ที่กำหนดเองได้ เพื่อให้ Git Bisect ทำงานอัตโนมัติตามความต้องการของคุณ Script ต้องคืนค่า Exit Code 0 (สำเร็จ) หรือ 1 (ไม่สำเร็จ)
#!/bin/bash
# test-script.sh
npm install
npm run build
if npm test > /dev/null 2>&1; then
echo "Tests passed"
exit 0
else
echo "Tests failed"
exit 1
fi
เรียกใช้:
git bisect run ./test-script.sh
ตัวอย่าง Practical Bisect Session
นี่คือตัวอย่างเซสชัน Bisect ที่สมบูรณ์ที่แสดงให้เห็นว่าการหา Commit ที่เป็นสาเหตุเป็นไปอย่างไร
$ git bisect start
$ git bisect bad
$ git bisect good v2.0
Bisecting: 10 revisions left to test after this
# ... Git checkout Commit ตรงกลาง
$ npm test
# FAIL - Bug พบ
$ git bisect bad
Bisecting: 5 revisions left to test after this
# ... Git checkout Commit ใหม่
$ npm test
# PASS - ไม่มี Bug
$ git bisect good
Bisecting: 2 revisions left to test after this
# ... ทำต่อจนกว่าหา Commit ที่เป็นสาเหตุ
$ git bisect reset
# ออกจาก Bisect Session
เคล็ดลับสำหรับ Bisect ที่มีประสิทธิภาพ
หากต้องการให้ Git Bisect ทำงานได้อย่างมีประสิทธิภาพ ให้ปฏิบัติตามเคล็ดลับต่อไปนี้:
- เลือก “Good” Commit ที่ไกลพอ เพื่อลดจำนวน Test ที่ต้องทำ
- ใช้ Automated Testing เมื่อเป็นไปได้ เพื่อประหยัดเวลา
- สร้าง Unit Tests สำหรับ Feature เพื่อลดเวลา Bisect
- อย่า Bisect ผ่าน Merge Commits มากมาย เนื่องจากอาจทำให้ผลลัพธ์ไม่ถูกต้อง
ความเชื่อมโยงกับเครื่องมือ Git อื่น
Git Bisect ทำงานร่วมกับเครื่องมือ Git อื่นๆ ได้ดี เช่น หากต้องการดูรายละเอียดของ Commit ที่พบ คุณสามารถใช้ Git Reflog เพื่อดูประวัติการทำงาน หรือใช้ Git Blame เพื่อดูว่าใครเป็นคนเขียน Code ที่ทำให้เกิด Bug ในกรณีที่ต้องการแก้ไขข้อผิดพลาด คุณอาจต้องใช้ Git Revert เพื่อยกเลิกการเปลี่ยนแปลง นอกจากนี้ Git Diff จะช่วยให้คุณเข้าใจความแตกต่างระหว่าง Commits ได้ชัดเจนขึ้น
สรุป
Git Bisect เป็นเครื่องมือที่มีประสิทธิภาพสำหรับหา Bug ใน Git History โดยใช้ Binary Search Algorithm ช่วยให้คุณประหยัดเวลาในการ Debugging และทำให้การพัฒนาเป็นไปอย่างเรียบร้อย โดยเฉพาะเมื่อทำงานบน VPS ของ Dot Enterprise ลองใช้ Git Bisect ในครั้งถัดไปที่พบ Bug จะช่วยให้คุณเข้าใจและแก้ไขปัญหาได้เร็วยิ่งขึ้น
