Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[Git] ว่าด้วยเรื่องของการ merge

$
0
0

สัปดาห์ที่ผ่านมานั้น มีโอกาสแบ่งปันความรู้เรื่อง การจัดการ 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 อย่างคือ
  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 เพื่อดูปัญหาได้ [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

Viewing all articles
Browse latest Browse all 1997

Trending Articles