สัปดาห์ที่ผ่านมานั้น มีโอกาสแบ่งปันความรู้เรื่อง
การจัดการ source code ด้วย Git
ซึ่งหนึ่งในคำถามและปัญหาคือ การ merge code นั่นเอง
ถ้า merge แล้วไม่มีปัญหา คงไม่เป็นไร
แต่ถ้า merge แล้วมีปัญหาที่ code ขัดแย้งหรือ conflict กัน
จะต้องทำอย่างไรดี ?
ที่สำคัญคือ Git มันทำการ merge อย่างไร ?
ดังนั้นมาหาคำตอบกันดีกว่า

ในการจัดการ version ของ source code ด้วย Git นั้น

เรามักจะเริ่มด้วย branch มากกว่า 1 branch เสมอ
ไม่ว่าจะเป็น master/dev, integration branch, feature branch และ git flow
ยิ่งจำนวน branch ยิ่งเยอะ ปัญหาก็ยิ่งแยะ !!
มันก็มีข้อดีมากมาย
แต่สิ่งที่ตามมาคือ การ merge code !!

คำถามที่น่าสนใจคือ
วันนี้นักพัฒนา merge code กันอย่างไร ?

ก่อนที่จะ merge เราเตรียมการอย่างไรบ้าง ?

ทำการตรวจสอบ code ที่ local หรือเครื่องของเราว่า
มีสถานะล่าสุดตรงกับ remote หรือบน server หรือไม่ ?
ด้วยคำสั่ง git fetch

จากนั้นต้องทำย้ายไปยัง branch การทำงานหลักของเรา
เพื่อทำการดึงการเปลี่ยนแปลงล่าสุดมาจาก remote ด้วยคำสั่ง

$git checkout 
$git pull

ตรงคำสั่ง git pull นั้นจะมีการทำงาน 2 ขั้นตอนคือ

$git fetch
$git merge

สิ่งที่เราจะพบเจอมีอยู่ 2 อย่างคือ

  1. ถ้าไม่มีการเปลี่ยนก็ชิว ๆ ไป
  2. ถ้ามีการเปลี่ยนแปลง ก็จะเจอการ merge แบบขัดแย้งและไม่ขัดแย้ง !!

ซึ่งตรงการ merge นี่แหละเป็นสิ่งที่เราต้องมาดูในรายละเอียดกัน

การ merge โดยปกติจะเรียกว่า Fast Forward Merge

ถ้าไม่มีการเปลี่ยนแปลงหรือข้อแตกต่างกับ branch หลักแล้ว
จะทำการย้าย pointer ของของ branch หลักไปยัง commit ใหม่
ทำให้เกิดการเรียง commit ในรูปแบบเส้นตรง
ซึ่งเป็นเหตุการณ์ที่เกิดขึ้นน้อยมาก ๆ
แสดงดังรูป

แต่ถ้า branch หลักแตกต่างจาก branch ของเราสิ่งที่เกิดขึ้นคือ Three-way merge

แค่ชื่อก็มี 3 ทางแล้ว ดูน่ากลัวและซับซ้อนน่าดู
สิ่งที่เกิดขึ้นจากการ merge คือ
ทำการสร้าง commit ใหม่ขึ้นมา 1 commit ซึ่งจะขึ้นต้นด้วยคำว่า Merge branch … of
เพื่อผูกหรือเชื่อมโยงของ branch ทั้งสองเข้าด้วยกัน
pointer ในแต่ละ branch ไม่ได้เปลี่ยนแปลงเลย
เกิดเป็น 3 ทางดังรูป

ผลที่ตามมาคือ การ merge จะเกิด conflict หรือไม่นั่นเอง !!
ถ้าไม่มี conflict ก็รอดไป
แต่ถ้ามีจะเราสามารถใช้คำสั่ง git status เพื่อดูปัญหาได้

จากตัวอย่างเราลอเปิดไฟล์ xxx.txt มาดู จะเจอบรรทัดที่เกิด conflict
จะมีตัว maker ใส่ไว้ดังนี้

  • <<<<<<< คือ จุดเริ่มต้นของ Conflict
  • ======= คือ เส้นแบ่งระหว่างการเปลี่ยนแปลงจาก branch หลัก กับ branch ของเรา
  • >>>>>>> คือ จุดสิ้นสุดของ Conflict

แสดงดังนี้

จากนั้นเราก็ต้องตัดสินใจว่า
ส่วนไหนจะอยู๋หรือจะไป หรือต้องรวมกัน
ตรงนี้นี่เอง ที่นักพัฒนาส่วนใหญ่
จะถามหาเครื่องมือในการ merge code !!
แต่ว่าเครื่องมือมันไม่ใช่การแก้ไขที่ต้นเหตุนะ

ดังนั้นเพื่อลดความเสี่ยงของการ merge แล้วเกิด conflict

จำเป็นต้องแก้ไขที่ต้นเหตุคือ
การคุยกัน
และหนึ่งในการคุยกันที่ดีคือ commit-> pull-> push บ่อย ๆ นั่นเอง
ส่วนเครื่องมือมันจะตามมาทีหลัง

เมื่อทุกอย่างเรียบร้อยก็ทำการ add, commit ต่อไป
ขอให้สนุกกับการ coding ครับ

Reference Websites
https://kolosek.com/git-merge

Tags:,