Coding Gun

วิธีการใช้งาน Git Merge

git merge คือคำสั่งที่ใช้รวม Code 2 ชุดที่แตกต่างกันเข้าด้วยกัน ซึ่งการ Merge จะเกิดในสถานการณ์ต่างๆ ดังต่อไปนี้

  1. git pull การที่เราใช้คำสั่ง git pull จะมีการทำงาน 2 ขั้นตอนย่อยๆคือ git fetch(Download code ลงมา) และ git merge(รวม Code เข้ากับ Commit ล่าสุด)
  2. Merge branch รวม Code ที่อยู่ใน Branch 2 Branches เข้าด้วยกัน
  3. Fork รวม Code ที่ได้ Fork repository ออกไป ผ่านทางการทำ Pull request

ตัวอย่างการใช้ git merge

สมมุติว่าเรากำลังพัฒนาโปรเจกต์ และมีสาขาหลักชื่อ main และเราสร้างสาขาชื่อ feature/login เพื่อเพิ่มฟีเจอร์ระบบล็อกอิน สิ่งที่เราต้องทำคือ

1. สร้าง feature branch ใหม่

เริ่มจากการสร้าง branch ขึ้นมาใหม่โดยส่วนใหญ่เราจะตั้งชื่อโดยมีคำว่า feature นำหน้า จะได้รู้ว่าเป็น feature ใหม่

git switch -c feature/login

หรือ

git checkout -b feature/login

ทั้ง 2 คำสั่งนี้จะสร้าง feature branch ขึ้นมาใหม่และย้าย HEAD ไปยัง branch feature/login ที่ได้สร้างขึ้นมาทันที

2. ทำการแก้ไขไฟล์และ commit

ทำการสร้างหรือเปลี่ยนแปลงตามที่เราต้องการ ในตัวอย่างนี้เราจะสร้างไฟล์ login.js ขึ้นมาใหม่ หลังจากนั้นก็ให้ add และ commit เข้ามาใน local repository ตามปกติ

git add login.js
git commit -m "add login feature"

3. กลับไปที่ Main branch

เมื่อเราจะทำการ Merge code เข้าไปใน Branch ไหน(target branch) ให้เรา switch กลับไปยัง branch นั้น ซึ่งในตัวอย่างนี้เราต้องการ Merge feature/login กลับเข้าไปใน Main branch เราจึงใช้คำสั่ง

git switch main

4. เตรียม Code ก่อน Merge

ก่อนที่จะ Merge code เข้าด้วยกันเราจำเป็นต้องตรวจสอบ Code ก่อนเพื่อป้องกันปัญหาโดยเราจะใช้คำสั่ง

git status

เพื่อตรวจสอบว่า Code ของเรา Commit เข้าไปใน Local repository หมดรึยัง ถ้า Code ไหนยังไม่เสร็จให้ใช้ git stash นำ Code นั้นออกไปเก็บข้างนอกก่อน

หลังจากนั้นให้ทำการ Pull code ล่าสุดจาก remote repository ลงมาก่อน

git pull

หลังจากนี้เราก็พร้อมเข้าสู่การ Merge ได้

ขั้นตอนนี้สำคัญมากเพราะจะทำให้ปัญหาในระหว่างการ Merge มีน้อยลง

5. รวม Branch feature/login เข้ากับ main

ทำการรวม Code ของ feature/login กลับเข้า Main branch ด้วยคำสั่ง

git merge feature/login

ผลลัพธ์จากการ Merge นั้นจะมี 2 กรณีคือ

  1. Git จะทำการรวมการเปลี่ยนแปลงจาก feature/login มายัง main ได้โดยไม่เกิด Conflict ซึ่ง Git สร้าง Merge Commit ขึ้นมาใหม่โดยอัตโนมัติ โดยจะมีข้อความว่า

     Merge made by the 'recursive' strategy.
    
  2. หากไม่สามารถนำ Code มารวมกันได้ โดยเกิด Conflict โดยมีข้อความนี้บนหน้าจอ

    Auto-merging login.js
    CONFLICT (content): Merge conflict in login.js
    Automatic merge failed; fix conflicts and then commit the result.
    

    ซึ่งเราจะต้องเข้าไปแก้ Conflict ในจุดที่ Code เกิด Conflict ที่จะมีสัญลักษณ์ต่างๆต่อไปนี้

    • <<<<<<< Conflict marker คือเครื่องหมายที่ระบุจุดเริ่มต้นของ Conflict
    • ======= Divides จบ Code ใน Branch ปัจจุบัน(Current) และเริ่มต้น Code ที่กำลังจะมาแทนที่(Incoming)
    • >>>>>>> จบ Conflict marker

    คุณสามมารถเลือก Accept Current, Accept Incoming หรือ Accept Both ก็ได้ ซึ่งถ้าเลือก Accept Both เราจะต้องลบ Code ที่เหมือนกันออกเอง และหลังจากที่เราแก้ไข Code เสร็จเรียนร้อย ให้เราทำการ add และ commit เข้าไปยัง Local repository

    git add .
    git commit -m "resolve conflict"
    

Fast Forward Merge

Fast-Forward Merge คือการ Merge ที่มี Commit ล่าสุดของ Branch ที่ต้องการ Merge ทั้ง 2 branches อยู่ในเส้นเดียวกัน ยกตัวอย่างเช่น ถ้าเราต้องการ Merge feature branch เข้าไปยัง Main branch ดังรูป git จะไม่ต้อง Merge code ใดๆเลย เพียงแค่เลื่อน Pointer ไปยัง Commit ล่าสุดเท่านั้น(จะไม่เกิด Merge Commit)

Fast forward merge
Fast forward merge

ในกรณีนี้เกิดจากการที่เราแตก branch ออกมาจาก branch หลักแล้วยังไม่ได้มีการเปลี่ยนแปลงใดๆ เกิดขึ้นกับ branch หลักเลย ซึ่งถ้าเราต้องการสร้าง Merge Commit ขึ้นมาเพื่อเป็นบันทึกว่าเรามีการ Merge branch เราจะใส่ --no-ff เข้าไปดังนี้

git merge --no-ff main

ในตัวอย่างนี้เราจะ Merge feature branch กลับเข้า Main branch พร้อมกับสร้าง Merge commit เสมอ

3-Way Merge

3-Way Merge คือการ Merge code ที่มีความแตกต่างกัน ซึ่งจะเกิดเมื่อเรากลับไป Commit code ใน Branch หลักที่เราได้แตกออกมา ดังรูป

3-Way Merge
3-Way Merge

ซึ่งในกรณีของการ Merge แบบ 3-way Merge นั้นจะต้องเกิด Merge Commit ทุกครั้ง ซึ่งการ Merge แบบนี้อาจทำให้เกิด Conflict ได้


สรุปการใช้งาน git merge

คำสั่ง git merge เป็นวิธีการรวม Code ที่แตกต่างกัน 2 ชุดเข้าด้วยกันซึ่งข้อดีของการ Merge คือ

  1. ไม่เปลี่ยนแปลงประวัติเดิม
  2. ง่ายต่อการอ่านประวัติในอนาคต (เราจะเห็น branch ที่ถูกแตกออกไปและรวมกลับเข้ามา)
  3. เหมาะสำหรับการรวม Code จาก Developer หลายคน
Phanupong Permpimol
Follow me