Merge Conflict คืออะไร
Merge Conflict เกิดขึ้นเมื่อ Git พยายาม merge (รวม) สองสาขาเข้าด้วยกัน แต่พบว่าไฟล์เดียวกันบรรทัดเดียวกันถูกแก้ไขโดยสองสาขา ทำให้ Git ไม่สามารถตัดสินใจได้ว่าการเปลี่ยนแปลงใดที่ควรเก็บไว้ Git จะหยุดการ merge และรอให้ผู้พัฒนาแก้ไขด้วยตนเองเสมอ
สถานการณ์ที่ทำให้เกิด Merge Conflict
- สองคนแก้ไขบรรทัดเดียวกันในไฟล์เดียวกันในสาขาต่างกัน
- คนหนึ่งแก้ไขไฟล์ แต่อีกคนลบไฟล์นั้น
- สองสาขาเพิ่มโค้ดใหม่ในตำแหน่งเดียวกัน
- การเปลี่ยนชื่อไฟล์หรือการจัดการโฟลเดอร์ขัดแย้งกัน
วิธีอ่าน Conflict Markers ใน Git
เมื่อเกิด conflict Git จะเพิ่ม conflict markers เข้าไปในไฟล์ที่มีปัญหา รูปแบบมาตรฐานคือ:
<<<<<<< HEAD
โค้ดจาก branch ปัจจุบัน (สาขาที่คุณอยู่)
=======
โค้ดจาก branch ที่กำลัง merge เข้ามา
>>>>>>> feature/login
รายละเอียดแต่ละส่วน:
- <<<<<<< HEAD — เริ่มต้นของโค้ดจาก branch ปัจจุบัน (HEAD)
- ======= — แยกโค้ดสองเวอร์ชั่น
- >>>>>>> feature/login — สิ้นสุดของโค้ดจาก branch ที่ merge เข้ามา
ขั้นที่ 1: ตรวจสอบไฟล์ที่มี Conflict
เมื่อเกิด conflict ให้รันคำสั่ง git status เพื่อดูรายชื่อไฟล์ที่มีปัญหา:
$ git status
# ผลลัพธ์:
# both modified: src/app.py
# both modified: config/settings.json
ขั้นที่ 2: เปิดไฟล์และแก้ไข Conflict
เปิดไฟล์ที่มี conflict ด้วยตัวแก้ไขข้อความ (text editor) จากนั้นทำการตัดสินใจว่าจะใช้โค้ดจากฝั่งไหน หรือผสมทั้งสองเข้าด้วยกัน หลังจากนั้นลบ conflict markers ออกให้สะอาดทั้งหมด
# ตัวอย่าง: ก่อนแก้ไข
<<<<<<< HEAD
app_name = "MyApp v1"
=======
app_name = "MyApp v2"
>>>>>>> feature/update-version
# หลังแก้ไข (เลือกใช้ v2 และลบ markers)
app_name = "MyApp v2"
ขั้นที่ 3: Stage ไฟล์ที่แก้ไขแล้ว
หลังจากแก้ไข conflict ให้ใช้ git add เพื่อให้ Git รู้ว่าการแก้ไขนี้เสร็จสิ้นแล้ว:
# Stage ไฟล์เดียว
git add src/app.py
# Stage หลายไฟล์
git add src/app.py config/settings.json
# Stage ทุกไฟล์ที่แก้ไข
git add .
ขั้นที่ 4: สร้าง Merge Commit
สุดท้ายให้สร้าง commit เพื่อยืนยันการ merge โดยเขียน commit message ที่บรรยายถึง conflict ที่แก้ไข:
git commit -m "Merge feature/update-version: resolve app_name conflict"
ใช้ Git Merge Tool เพื่อแก้ไข Conflict
Git มี merge tool ที่ช่วยอำนวยความสะดวก โดยแสดง 3-way comparison (ต้นทาง ปลายทาง และ base) ให้เห็นภาพชัดเจนมากขึ้น:
# เปิด merge tool ที่ตั้งค่าไว้ (เช่น vimdiff, vscode, meld)
git mergetool
# ตั้งค่า merge tool เป็น VS Code
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
ยกเลิก Merge และเริ่มต้นใหม่
หากการ merge มีความซับซ้อนมากเกินไป สามารถยกเลิกและเริ่มต้นใหม่ได้:
# ยกเลิก merge ที่อยู่ระหว่างดำเนินการ
git merge --abort
# ยกเลิก rebase (ถ้า conflict เกิดขึ้นในระหว่าง rebase)
git rebase --abort
ใช้ Visual Studio Code สำหรับแก้ไข Conflict
VS Code มี UI ที่สามารถเลือกได้หลายตัวเลือก เช่น “Accept Current”, “Accept Incoming”, “Accept Both” และ “Compare Changes” ซึ่งช่วยให้การแก้ไข conflict เป็นเรื่องง่ายและชัดเจนมากขึ้น
วิธีป้องกัน Merge Conflict
- Pull บ่อยๆ — ดึง (pull) การเปลี่ยนแปลงใหม่บ่อยๆ เพื่อให้ branch ของคุณทันสมัยเสมอ
- แบ่งงานชัดเจน — อย่าให้หลายคนแก้ไขไฟล์เดียวกันในเวลาเดียวกัน
- สร้าง branch ขนาดเล็ก — ใช้ branch ขนาดเล็กและ merge บ่อย แทนการทำงานนานเป็นสัปดาห์
- ใช้ Feature Flags — ซ่อนคุณสมบัติใหม่ไว้เบื้องหลัง feature flags แทนการแก้ไขโค้ดหลักโดยตรง
- จัดการสาขาอย่างเป็นระเบียบ — ใช้ branching strategy ที่ชัดเจน เช่น Git Flow
Git Flow Strategy เพื่อลดความขัดแย้ง
การใช้ Git Flow branching strategy ช่วยจัดการ conflict ได้ดีขึ้น โดยการแยกออกเป็น branch ต่างๆ (develop, release, hotfix) เพื่อลดโอกาสที่จะเกิด conflict ในหลาย branch พร้อมกัน
Commit Message ที่ดี สำหรับ Merge Conflict
เมื่อเขียน commit message สำหรับการแก้ไข conflict ควรระบุให้ชัดเจนว่า conflict ใดที่แก้ไข ทำไมจึงเลือกตัวเลือกใด และจุดประสงค์ของการแก้ไข เพื่อให้ผู้อื่นที่อ่านไฟล์ลืมหลังจากนี้สามารถเข้าใจบริบทได้ดี
Rebase vs Merge: เลือกวิธีใดให้เหมาะสม
Merge และ rebase เป็นสองวิธีที่แตกต่างกัน และแต่ละวิธีมีข้อดีข้อเสียของตัวเอง การใช้ merge จะรักษา history ที่ชัดเจนของสาขาที่รวม แต่ rebase จะให้ history ที่เป็นเส้นตรงและสะอาดขึ้น
สรุป
Merge Conflict ไม่ใช่สิ่งที่น่ากลัว มันเป็นส่วนของการทำงานร่วมกันในทีม ขั้นตอนที่สำคัญคือ 1) ดูไฟล์ที่มี conflict 2) เปิดและแก้ไขอย่างชำนาญ 3) ลบ conflict markers 4) git add 5) git commit การแก้ไข conflict บ่อยๆ จะทำให้คุณชำนาญและมั่นใจมากขึ้น ส่วนการวางแผนการทำงานร่วมกันอย่างดีจะช่วยลดโอกาสที่จะเกิด conflict ได้อย่างมาก
