Git branching strategies vs trunk base development ตอนที่ 2

ประเภทของ branch ใน Git

Chokchai Phatharamalai
odds.team
2 min readJan 24, 2022

--

Photo by Stephen Ellis on Unsplash

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 ก็จะยิ่งมากเท่านั้น เพราะโค้ดมันแตกต่างไปจากโค้ดส่วนกลางมาก

source: https://launchdarkly.com/blog/git-branching-strategies-vs-trunk-based-development/

ไอ้ความต่างจากโค้ดส่วนกลางเยอะ ๆ นี่แหละที่ขัดขวางไม่ให้ Git merge อัตโนมัติได้ และก่อให้เกิดอาการหลอนคลาสสิกจาก merge conflict ทั้งเสียเวลา, โค้ดหาย หรือบั๊กที่แก้แล้วมันย้อนกลับมาเพราะโค้ดที่ถูกลบไปมันกลับมาได้ไงไม่รู้

และเพราะเหตุผลนี้แหละ trunk-based development ถึงได้รับความนิยม เพราะมันป้องกันความทรมาณจาก merge conflicts ได้ดี ไว้เราจะมาเล่ารายละเอียดของ trunk-based development เพิ่มเติมในตอนต่อ ๆ ไป

อ้างอิง

--

--