หาบั๊กด้วย git กับคำสั่ง git bisect

Screenshot from 2016-06-12 18-12-29

ถ้าใครใช้ Twitica Desktop 3 (ชื่อชั่วคราว) อาจจะเห็นบั๊กในรุ่นใหม่ว่า tweet ที่มีข้อความซ้อนกันมันจะไม่ซ่อนภาพประกอบ ซึ่งปกติถ้าเลื่อนออกไปแล้วมันจะซ่อนเอง

ทีนี้พอจะแก้ผมก็ตั้งสมมุติฐานไว้ว่า commit สุดท้ายก่อนจะออก คือระบบ action มันทำพัง แต่คิดไปคิดมาแล้วก็ไม่น่าจะเกี่ยวกัน คิดไปคิดมาแล้วก็เลยอยากแนะนำให้รู้จักเครื่องมือช่วยงานอย่าง git bisect ครับ

วิธีใช้งานมีดังนี้ครับ


เปิดใช้ bisect

ก่อนอื่นให้สั่ง git bisect start เพื่อเริ่มกระบวนการ bisect ก่อนครับ จากนั้นเราจะต้องแนะนำให้มันรู้สถานะต่างๆ ก่อน

Screenshot from 2016-06-12 18-16-00

คำสั่งแรกคือ git bisect bad แล้วตามด้วยเลข commit (หรือถ้าไม่ใส่จะใช้เป็น commit ปัจจุบัน) เพื่อบอกว่า commit นี้มีบั๊กอยู่

คำสั่งถัดมาคือ git bisect good v0.4.1 ด้านหลังนี้ให้ระบุเป็นเลข commit ครับ หรืออย่างผมได้ tag v0.4.1 ไว้ใน commit ของรุ่นที่แล้ว (ที่ผมมั่นใจว่ามันไม่มีบั๊ก)

พอ git มีช่วงให้ทำงานแล้วก็จะกรอกลับไปตรงกลาง (แบบ Binary search) ระหว่าง 2 commit นั้นครับ

เทส

หลังจากนั้นแล้วให้เทส commit นั้นครับ จะเป็น unit testing ก็ได้ หรือผมไม่มี unit test ก็ compile-run ดูเลยก็ได้ว่ายังบั๊กอยู่ไหม เสร็จแล้วก็รายงานผลด้วยคำสั่งเดิมครับ git bisect good หรือ git bisect bad ทำซ้ำจนกระทั่ง bisect เสร็จ

Screenshot from 2016-06-12 18-23-07

เมื่อล้อมเข้ามาถึงขั้นสุดท้ายแล้ว bisect ก็จะแสดงผล commit ที่ทำให้เกิดบั๊กขึ้นมาครับ จะเปิด diff ดูก็ได้ครับ

Screenshot from 2016-06-12 18-24-29

(ในภาพนี้ใช้คำสั่ง git show ตามด้วยเลข commit)

ดู diff แป๊บเดียวเห็นเลยว่าผมแอบเพิ่ม shouldComponentUpdate ไป (แถม commit message ก็ไม่ได้บอกด้วยนะ) แล้วมันทำให้ tweet ที่ซ้อนอยู่ไม่อัพเดต

แก้บั๊ก

เมื่อเจอแล้วอย่าลืม git bisect reset เพื่อออกจาก bisect ก่อนนะครับ ไม่อย่างนั้นเราจะทำงานใน commit ที่บั๊กอยู่ ก่อนจะ reset จะสั่ง git bisect log เพื่อเก็บ log ไว้ดูเล่นก็ได้ครับ

Screenshot from 2016-06-12 18-26-31

สรุปแล้วคำสั่ง git bisect จะช่วยย้อน commit ให้เรา โดยกระโดดเป็นช่วงๆ เพื่อให้สามารถหาต้นตอของบั๊กได้อย่างสะดวกครับ ในเคสของผมนี่ถ้าไปนั่งไล่โค้ดคงจะอีกนานกว่าจะเจอสาเหตุ