Merge Conflict
ทดลองสร้าง conflict และ resolve ด้วยตัวเอง เข้าใจ marker 3 ตัว และวิธีลด conflict ในทีม
เรื่องที่ beginner กลัวที่สุดคือ merge conflict ทั้งๆ ที่จริงมันไม่น่ากลัว แค่เป็นสถานการณ์ที่ Git บอกคุณว่า “ฉันตัดสินใจเองไม่ได้” ให้คุณเลือกแทน
Conflict เกิดเมื่อไหร่
Git รวม 2 branch เข้าด้วยกันได้อัตโนมัติถ้าทั้งสองแก้คนละไฟล์ หรือแก้ไฟล์เดียวกันแต่คนละบรรทัด แต่ถ้าทั้ง 2 ฝั่ง แก้บรรทัดเดียวกันของไฟล์เดียวกันคนละแบบ Git จะไม่รู้ว่าจะเอาของใคร เพราะไม่ใช่ทั้ง 2 ฝั่งก็ถูก ต้องให้คุณเลือก
ลองสร้างและ resolve conflict ด้วยตัวเอง
ด้านล่างคือ widget ที่จำลองสถานการณ์ทั้งหมด main กับ feature แก้ line 3 ของไฟล์เดียวกันคนละแบบ กดปุ่มลอง merge ดูว่าเกิดอะไร แล้วเลือกวิธี resolve
line 3 ของไฟล์เดียวกัน แต่แก้คนละแบบ1# My Portfolio23ผลงานเว็บและแอปที่ผมทำไว้ พร้อม source code
1# My Portfolio23ผลงานเว็บของ Somchai นักพัฒนา full-stack
Conflict marker 3 ตัวคืออะไร
เวลา Git เจอ conflict มันจะใส่ marker พิเศษลงในไฟล์ 3 จุด:
<<<<<<< HEAD= จุดเริ่มของฝั่ง current branch (main ในกรณีนี้)======== เส้นแบ่งระหว่าง 2 ฝั่ง>>>>>>> feature= จุดจบของฝั่งที่ merge เข้ามา
หน้าที่ของคุณคือเปิดไฟล์ ลบ marker ทั้ง 3 บรรทัดออก แล้วเก็บเฉพาะโค้ดที่คุณต้องการ (จะเอาของฝั่งไหน เอาทั้ง 2 ฝั่ง หรือเขียนใหม่ก็ได้)
ขั้นตอนหลัง resolve
git add file.tsบอก Git ว่าไฟล์นี้ resolve แล้วgit commit(ไม่ต้องใส่-mGit จะเตรียม commit message “Merge...” ให้ กด save ใน editor ก็พอ)- ถ้าเปลี่ยนใจอยากยกเลิก merge ใช้
git merge --abortกลับไปสถานะก่อน merge
วิธีลด conflict ให้เจอน้อยลง
- Pull บ่อยๆ ระหว่างทำงาน ไม่ค้างไว้หลายวันจนประวัติต่างไกล
- Commit บ่อยๆ commit เล็กย่อยแก้ง่ายกว่า commit ใหญ่ก้อนเดียว
- คุยกับทีม ถ้ารู้ว่ามีคนแก้ส่วนเดียวกัน คุยก่อนดีกว่าทั้งคู่เขียนทับกัน
- PR เล็ก merge เร็ว PR ใหญ่ค้าง 2 สัปดาห์ conflict รอท่าอยู่
สรุป
- Conflict เกิดเมื่อ 2 branch แก้บรรทัดเดียวกันของไฟล์เดียวกันคนละแบบ
- Git ใส่ marker
<<<<<<<=======>>>>>>>ลงในไฟล์ - หน้าที่คุณคือลบ marker แล้วเก็บโค้ดที่ถูก จะเลือกฝั่งไหนเอาทั้งคู่หรือเขียนใหม่ก็ได้
- หลัง resolve:
git add+git commit - ลด conflict ด้วยการ pull บ่อย commit บ่อย PR เล็ก
lesson ถัดไปจะว่าด้วย pull request workflow ที่เป็นหัวใจของการทำงานเป็นทีมบน GitHub