[Tech] How to resolve conflict on main branch
Introduction
เมื่อ Developer พร้อมที่จะเริ่มงาน จะมีการแยก branch ออกจาก main branch ทั้งหมด 3 branch ได้แก่
- Main - branch หลักที่คอยเก็บรวบรวม source code ต่างๆ ที่พร้อมใช้งาน ซึ่ง Developer จะไม่ยุ่งกับ branch นี้โดยตรง
- Feature - branch หลักที่สำหรับพัฒนา feature ต่างๆ ซึ่งจะแยกออกจาก main branch เมื่อ feature เสร็จสิ้น จะ pull-request กลับไปที่ main branch
- Development - branch ที่แยกจาก Feature branch อีกที เอาไว้พัฒนาส่วนต่างๆ ของ feature เมื่อพัฒนาจนเสร็จและพร้อมที่จะประกอบเข้าไปใน feature branc จะ pull-request กลับไปที่ feature branch
Confliction
โอกาศเกิด conflict สามารถมีได้บ่อยครั้งมากในการทำงานจริง โดยปกติเมื่อเกิด conflict ขึ้นภายใน feature ทีมจะสามารถแก้ไขได้หลายวิธี แล้วแต่ที่ทีมจะจัดการหรือตกลงคุยกันไว้
แต่เมื่อ conflict เกิดขึ้นในระหว่าง pull-request feature branchไปยัง main branch ดังรูปนี้
Developer จะต้องแก้ไขโดยใช้วิธีการดังนี้
- สร้าง branch ใหม่ที่แยกจาก main branch (ในตัวอย่างจะใช้ชื่อ hotfix)
- merge feature branch เข้ามาที่ hotfix branch และแก้ไขให้เรียบร้อย
- เมื่อทดสอบแล้วว่าไม่พบปัญหาใดๆ (build & test) หลังจากการแก้ไขเสร็จ ให้ merge hotfix branch เข้ามาที่ feature branch อีกรอบ
- pull-request feature branchไปยัง main branch อีกรอบ (ถ้า pull-request ค้างไว้อยู่ ให้ push ขึ้นไปใหม่ได้เลย)
Summary
แม้ว่าการแก้ไข conflict จะสามารถแก้ไขได้หลายวิธี แต่หลักสำคัญก็คือ เราควรจะคุยกับทีมว่าจะมีมาตรการ วิธีแก้ไข conflict อย่างไร แล้วให้ทีมใช้มาตรการเดียวกันทั้งหมด ซึ่งในบทความนี้ คือ ตัวอย่างมาตรการที่ทีมผู้เขียนจะปรับใช้งานกัน
References
[1]: Microsoft Azure. (28/02/2020). Resolve Merge Conflicts in Azure DevOps