Git branching strategies vs trunk base development ตอนที่ 2
ประเภทของ branch ใน Git
Git จัดการ branch ยังไง
branch ต่าง ๆ ใน Git เป็นแค่ tag หรือ pointer เท่านั้น
Git แตกต่างกับ source control อื่น ๆ ตรงที่ Git ไม่ได้ track ความเปลี่ยนแปลงด้วยการ copy file ต่าง ๆ มา แต่ละ node ใน git history เก็บแค่ความเปลี่ยนแปลงชุดนึงที่เกิดขึ้น ณ เวลาหนึ่งเท่านั้น ฉะนั้น history ใน git เป็นแค่ graph ของความเปลี่ยนแปลงนั่นเอง การ merge ก็เป็นการแก้โครงสร้างของ graph โดยที่ไม่ได้แตะ file ใด ๆ เลย ทำให้ branch ต่าง ๆ ใน Git นั้น light-weight มาก
ประเภทของ branch ที่เจอบ่อย ๆ
Trunk branch
ทุก git repository มี trunk (บ่อยครั้งถูกเรียกว่า mian หรือ master) trunk เป็น branch แรกที่เกิดโดยอัตโนมัติตอนเราสร้าง repository ขึ้นมา การที่ trunk จะเปลี่ยนตอนไหนนั้นขึ้นกับว่าเราเลือกกลยุทธ์ในการ branch แบบไหน
สำหรับ trunk-based development นั้น คือการที่ developer ทุกคนรุมทำงานกันบน branch นี้ branch เดียว
Development branch
Development branch คือ feature branch ถาวรที่เอาไว้เก็บความเปลี่ยนแปลงที่ทั้งทีมทำก่อนที่จะเอาเข้า production
branch นี้จะวิ่งคู่กันไปกับ trunk และจะไม่เคยถูกลบเลย
บางทีมจะ setup non-production environment คู่กันกับ branch นี้ไว้ เช่น พอมีใคร commit เข้า branch นี้ก็จะ trigger ให้ test environment ถูก deploy
ปรกติ development branch กับ trunk จะถูก integrate เข้าด้วยกันบ่อย ๆ จากทั้ง 2 ทิศทาง (integrate develop เข้า trunk หรือ trunk เข้า develop) ซึ่งมักจะถูกทำโดยสมาชิกในทีม
Feature branch
Feature branch อาจจะอายุสั้นหรือยาวก็ได้ แล้วแต่ branching strategy ที่ทีมเลือกใช้ ส่วนใหญ่จะใช้เก็บความเปลี่ยนแปลงของ developer คนนึงเกี่ยวกับ feature นั้น ๆ แต่บางที feature branch ก็ถูกแชร์ให้หลาย ๆ คนรุมทำได้เหมือนกัน
สรุปแล้ว feature branch จะมีลักษณะยังไงจะต้องดู branching strategy ที่ทีมเลือกใช้เป็นหลัก
Release branch
Release branch อาจจะอายุสั้นหรือยาวก็ได้ ขึ้นอยู่กับ branching strategy ที่ทีมเลือกเหมือนกัน เจตนาหลัก ๆ ของ release branch คือเอาไว้เก็บความเปลี่ยนแปลงที่เราตั้งใจจะ release ไปยัง production
Hotfix branch
โดยปรกติแล้ว hotfix branch จะใช้เก็บ bug fix ที่ต้องแก้ด่วน ๆ branch ประเภทนี้จะอายุสั้นหรือยาวก็ได้ ปรกติมักจะอายุยืนและแตกออกมาจาก release branch
branch ประเภทนี้มักจะถูกใช้กับ product ที่มี version เช่น application ที่ต้อง install บนเครื่องเพื่อใช้งาน
ความทรมาณจาก Merge conflicts
บ่อยครั้งที่เราจะพบทีมพัฒนาปวดหัวกับ branch อีรุงตุงนังที่ต้อง merge เข้ากับ mainline พร้อม ๆ กัน ยิ่ง branch ที่แตกมาไม่ถูก merge มานานเท่าไหร่ ความเสี่ยงที่จะเกิด conflict ก็จะยิ่งมากเท่านั้น เพราะโค้ดมันแตกต่างไปจากโค้ดส่วนกลางมาก
ไอ้ความต่างจากโค้ดส่วนกลางเยอะ ๆ นี่แหละที่ขัดขวางไม่ให้ Git merge อัตโนมัติได้ และก่อให้เกิดอาการหลอนคลาสสิกจาก merge conflict ทั้งเสียเวลา, โค้ดหาย หรือบั๊กที่แก้แล้วมันย้อนกลับมาเพราะโค้ดที่ถูกลบไปมันกลับมาได้ไงไม่รู้
และเพราะเหตุผลนี้แหละ trunk-based development ถึงได้รับความนิยม เพราะมันป้องกันความทรมาณจาก merge conflicts ได้ดี ไว้เราจะมาเล่ารายละเอียดของ trunk-based development เพิ่มเติมในตอนต่อ ๆ ไป