สัปดาห์ที่ผ่านมานั้น มีโอกาสแบ่งปันความรู้เรื่อง
การจัดการ 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 โดยปกติจะเรียกว่า 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 เพื่อดูปัญหาได้ [gist id="7373d581ccf0acf8ef7e8ae3d122ef45" file="1.txt"] จากตัวอย่างเราลอเปิดไฟล์ xxx.txt มาดู จะเจอบรรทัดที่เกิด conflict จะมีตัว maker ใส่ไว้ดังนี้- <<<<<<< คือ จุดเริ่มต้นของ Conflict
- ======= คือ เส้นแบ่งระหว่างการเปลี่ยนแปลงจาก branch หลัก กับ branch ของเรา
- >>>>>>> คือ จุดสิ้นสุดของ Conflict