![]()
![]()
สัปดาห์ที่ผ่านมานั้น มีโอกาสแบ่งปันความรู้เรื่อง
การจัดการ 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 ด้วยคำสั่ง
[code]
$git checkout
$git pull
[/code]
ตรงคำสั่ง git pull นั้นจะมีการทำงาน 2 ขั้นตอนคือ
[code]
$git fetch
$git merge
[/code]
สิ่งที่เราจะพบเจอมีอยู่ 2 อย่างคือ
- ถ้าไม่มีการเปลี่ยนก็ชิว ๆ ไป
- ถ้ามีการเปลี่ยนแปลง ก็จะเจอการ merge แบบขัดแย้งและไม่ขัดแย้ง !!
ซึ่งตรงการ 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 เพื่อดูปัญหาได้
[gist id="7373d581ccf0acf8ef7e8ae3d122ef45" file="1.txt"]
จากตัวอย่างเราลอเปิดไฟล์ xxx.txt มาดู จะเจอบรรทัดที่เกิด conflict
จะมีตัว maker ใส่ไว้ดังนี้
- <<<<<<< คือ จุดเริ่มต้นของ Conflict
- ======= คือ เส้นแบ่งระหว่างการเปลี่ยนแปลงจาก branch หลัก กับ branch ของเรา
- >>>>>>> คือ จุดสิ้นสุดของ Conflict
แสดงดังนี้
[gist id="7373d581ccf0acf8ef7e8ae3d122ef45" file="xxx.txt"]
จากนั้นเราก็ต้องตัดสินใจว่า
ส่วนไหนจะอยู๋หรือจะไป หรือต้องรวมกัน
ตรงนี้นี่เอง ที่นักพัฒนาส่วนใหญ่
จะถามหาเครื่องมือในการ merge code !!
แต่ว่าเครื่องมือมันไม่ใช่การแก้ไขที่ต้นเหตุนะ
ดังนั้นเพื่อลดความเสี่ยงของการ merge แล้วเกิด conflict
จำเป็นต้องแก้ไขที่ต้นเหตุคือ
การคุยกัน
และหนึ่งในการคุยกันที่ดีคือ commit-> pull-> push บ่อย ๆ นั่นเอง
ส่วนเครื่องมือมันจะตามมาทีหลัง
เมื่อทุกอย่างเรียบร้อยก็ทำการ add, commit ต่อไป
ขอให้สนุกกับการ coding ครับ
Reference Websites
https://kolosek.com/git-merge