Merge (การรวม) — คืออะไร, merge ทำงานอย่างไรและกลยุทธ์การรวม

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-08-01 เวลาอ่าน: 9 นาที

Merge (การรวม) คือการดำเนินการรวมสาขาใน Git ที่รวมการเปลี่ยนแปลงจากสายการพัฒนาที่แตกต่างกันสองสายเข้าสู่สาขาปลายทางเดียว ซึ่งแตกต่างจาก rebase, merge จะรักษาประวัติการแตกสาขาทั้งหมดไว้โดยการสร้าง commit การรวมพิเศษที่มี parent สองตัว ตาม เอกสารทางการของ Git (2026) merge เป็นวิธีที่ปลอดภัยที่สุดในการรวมสาขาเนื่องจากไม่เขียนประวัติใหม่และช่วยให้ติดตามได้ว่าเมื่อใดและสาขาใดถูกรวมเข้าด้วยกัน เป็นตัวเลือกมาตรฐานสำหรับการรวมในสาขาสาธารณะ เช่น main, develop และ release

ประเด็นสำคัญ

  • Merge (การรวม) — การรวมสาขาโดยสร้าง commit การรวมที่รักษาประวัติของทั้งสองสาขา
  • Commit การรวม — commit พิเศษที่มี parent สองตัวซึ่งบันทึกเหตุการณ์การรวม
  • กลยุทธ์การรวม — recursive, octopus, ours, squash — แต่ละแบบเหมาะสำหรับสถานการณ์ที่แตกต่างกัน
  • ข้อขัดแย้ง — เกิดขึ้นเมื่อบรรทัดเดียวกันถูกเปลี่ยนแปลงในทั้งสองสาขาและต้องแก้ไขด้วยตนเอง
  • ความปลอดภัย — merge ไม่เปลี่ยนแปลง commit ที่มีอยู่ จึงปลอดภัยสำหรับสาขาสาธารณะ

Merge ใน Git คืออะไร

Merge คือคำสั่ง git merge ที่รวมการเปลี่ยนแปลงจากสาขาที่ระบุไปยังสาขาปัจจุบัน Git ค้นหาบรรพบุรุษร่วม (commit ฐาน) คำนวณ diff ของแต่ละสาขาเทียบกับบรรพบุรุษ และสร้าง commit การรวมที่มีชุดการเปลี่ยนแปลงที่รวมกัน ผลลัพธ์คือสาขาปลายทางได้รับการเปลี่ยนแปลงทั้งหมดจากสาขาที่ถูกรวม

ไวยากรณ์: ขณะอยู่ที่สาขาปลายทาง (เช่น main) ให้รัน git merge feature Git จะสร้าง commit การรวมโดยอัตโนมัติหากไม่มีข้อขัดแย้ง ข้อความ commit การรวมเริ่มต้นคือ: “Merge branch 'feature' into main” คุณสามารถเปลี่ยนข้อความได้โดยใช้แฟล็ก -m หรือแก้ไขในโปรแกรมแก้ไขที่เปิดขึ้น

Merge เป็นการดำเนินการที่ไม่ทำลาย ซึ่งแตกต่างจาก rebase, merge ไม่แตะต้อง commit ที่มีอยู่: พวกมันยังคงมี hash, ผู้เขียน และวันที่เหมือนเดิม ซึ่งทำให้ merge เป็นวิธีเดียวที่ปลอดภัยในการรวมสาขาที่นักพัฒนาหลายคนทำงานพร้อมกัน หากมีสิ่งผิดปกติ สามารถยกเลิก merge ได้ด้วย git merge --abort

bash
# สลับไปยังสาขาปลายทาง
git checkout main

# รวมสาขาคุณสมบัติ
git merge feature

# ผลลัพธ์ — commit การรวมที่มี parent สองตัว
git log --oneline --graph

# รวมด้วยข้อความที่กำหนดเอง
git merge feature -m "feat: integrate authentication module"

ประเภทของ merge: regular, squash, fast-forward

Git รองรับสามโหมดการรวม ซึ่งเลือกตามผลลัพธ์ที่ต้องการ การรวมแบบปกติ (ค่าเริ่มต้น) สร้าง commit การรวม Squash merge รวม commit ทั้งหมดของสาขาคุณสมบัติเป็นหนึ่งเดียว Fast-forward เลื่อนตัวชี้สาขาไปข้างหน้าโดยไม่สร้าง commit หากเป็นไปได้ การเลือกโหมดขึ้นอยู่กับขั้นตอนการทำงานของทีมและกฎของประวัติ

การรวมแบบปกติ (--no-ff) — สร้าง commit การรวมแม้ว่าการรวมจะสามารถทำเป็น fast-forward ได้ แนะนำสำหรับสาขา main: commit การรวมจะระบุจุดรวมคุณสมบัติอย่างชัดเจนและช่วยให้ย้อนกลับการเปลี่ยนแปลงทั้งหมดของสาขาคุณสมบัติได้ง่ายด้วยการ revert เพียงครั้งเดียว GitHub ใช้โหมดนี้เป็นค่าเริ่มต้นเมื่อรวม PR ผ่านปุ่ม Merge

Squash merge (--squash) — รวบรวม commit ทั้งหมดของสาขาคุณสมบัติเป็น commit เดียวในสาขาปลายทาง มีประโยชน์เมื่อประวัติร่างของสาขาคุณสมบัติไม่ควรทำให้ main ยุ่งเหยิง ข้อเสีย: การเชื่อมต่อกับ commit ดั้งเดิมหายไป — ไม่สามารถเห็นว่าคุณสมบัติถูกพัฒนาทีละขั้นตอนอย่างไร GitHub ใช้โหมดนี้เมื่อเลือก “Squash and merge” ใน PR

Fast-forward (--ff) — หากสาขาปลายทางไม่มี commit ใหม่ตั้งแต่สาขาคุณสมบัติแตกออกไป Git ก็เพียงเลื่อนตัวชี้ไปข้างหน้าโดยไม่สร้าง commit การรวม ประวัติยังคงเป็นเส้นตรง แฟล็ก --no-ff บังคับให้สร้าง commit การรวม ในขณะที่ --ff-only จะแสดงข้อผิดพลาดหาก fast-forward ไม่สามารถทำได้

bash
# บังคับ commit การรวม (แนะนำสำหรับ main)
git merge --no-ff feature

# Squash merge — commit ทั้งหมดเป็นหนึ่งเดียว
git merge --squash feature
git commit -m "feat: add authentication"

# Fast-forward เฉพาะเมื่อเป็นไปได้
git merge --ff-only feature

# ยกเลิกการรวมที่มีข้อขัดแย้ง
git merge --abort

กลยุทธ์การรวมของ Git

กลยุทธ์การรวม กำหนดอัลกอริทึมที่ Git ใช้เพื่อรวมการเปลี่ยนแปลง แต่ละกลยุทธ์เหมาะสำหรับสถานการณ์ที่แตกต่างกัน Git เลือกกลยุทธ์ที่เหมาะสมโดยอัตโนมัติ แต่นักพัฒนาสามารถระบุได้อย่างชัดเจนด้วยแฟล็ก --strategy การเข้าใจกลยุทธ์ช่วยให้คาดการณ์พฤติกรรมของ Git ในการรวมที่ซับซ้อน

Recursive — กลยุทธ์เริ่มต้นสำหรับการรวมสองสาขา Git ค้นหาบรรพบุรุษร่วม คำนวณการเปลี่ยนแปลงในแต่ละสาขา และรวมเข้าด้วยกัน หากพบบรรพบุรุษร่วม recursive จะจัดการกับการเปลี่ยนชื่อไฟล์และการเพิ่มไฟล์อย่างถูกต้อง ระหว่างข้อขัดแย้ง recursive สามารถใช้ตัวเลือกเพิ่มเติม: ours (เลือกเวอร์ชันของเราโดยอัตโนมัติ) และ theirs (เลือกเวอร์ชันของพวกเขา)

Octopus — สำหรับการรวมมากกว่าสองสาขาพร้อมกัน: git merge feature1 feature2 feature3 Octopus ไม่รองรับการแก้ไขข้อขัดแย้ง — ข้อขัดแย้งทั้งหมดต้องได้รับการแก้ไขก่อนเรียกใช้คำสั่ง ใช้น้อยมาก ส่วนใหญ่เพื่อรวมสาขาอิสระหลายสาขาที่รับประกันว่าไม่ขัดแย้งกัน (เช่น โมดูลที่แตกต่างกัน)

กลยุทธ์จำนวนสาขาการแก้ไขข้อขัดแย้ง
Recursive2อัตโนมัติ + ตัวเลือก ours/theirs
Octopus3+ไม่ — ข้อขัดแย้งทั้งหมดต้องแก้ไขล่วงหน้า
Oursใดๆเลือกเวอร์ชันของเราเสมอ ไม่สนใจการเปลี่ยนแปลงภายนอก
Subtree2สำหรับการรวม subtree

Ours — กลยุทธ์พิเศษที่ไม่สนใจการเปลี่ยนแปลงจากสาขาที่ถูกรวมอย่างสิ้นเชิงและเก็บเนื้อหาปัจจุบันของสาขาปลายทางไว้ มีการสร้าง commit การรวมขึ้น แต่เนื้อหาไม่เปลี่ยนแปลง มีประโยชน์เมื่อคุณต้องการบันทึกข้อเท็จจริงของการรวมในประวัติแต่จริงๆ แล้วปฏิเสธการเปลี่ยนแปลงทั้งหมดจากสาขาอื่น

การแก้ไขข้อขัดแย้งของ merge

ข้อขัดแย้งของ merge เกิดขึ้นเมื่อบรรทัดเดียวกันของไฟล์ถูกเปลี่ยนแปลงต่างกันในทั้งสองสาขา Git ไม่สามารถระบุได้โดยอัตโนมัติว่าเวอร์ชันใดถูกต้องและหยุดการรวมชั่วคราว ข้อขัดแย้งอาจเกิดขึ้นเมื่อไฟล์ถูกเปลี่ยนชื่อในสาขาหนึ่งและถูกแก้ไขในอีกสาขาหนึ่ง หรือเมื่อไฟล์เดียวกันถูกลบและแก้ไขพร้อมกัน

กระบวนการแก้ไข: Git ทำเครื่องหมายไฟล์ที่มีข้อขัดแย้งด้วยเครื่องหมาย ไฟล์จะแสดงส่วนที่มี <<<<<<< HEAD (เวอร์ชันของเรา), ======= (ตัวคั่น) และ >>>>>>> feature (เวอร์ชันของพวกเขา) นักพัฒนาแก้ไขส่วนที่มีข้อขัดแย้งด้วยตนเอง เลือกบรรทัดที่ต้องการจากทั้งสองเวอร์ชัน ลบเครื่องหมาย บันทึกไฟล์ และเพิ่มลงในดัชนีด้วย git add

สำหรับการแก้ไขข้อขัดแย้งด้วยภาพ Git รองรับ mergetool — เครื่องมือเปรียบเทียบภายนอก Mergetool ยอดนิยม: Meld, KDiff3, Beyond Compare, VS Code (โปรแกรมแก้ไขข้อขัดแย้งในตัว) Mergetool แสดงสามแผง: เวอร์ชันของเรา เวอร์ชันของพวกเขา และผลลัพธ์ นักพัฒนาเลือกบล็อกโค้ดด้วยภาพเพื่อรวมในไฟล์สุดท้าย

bash
# เริ่มการรวมและตรวจจับข้อขัดแย้ง
git merge feature
# ข้อขัดแย้ง (เนื้อหา): ข้อขัดแย้งการรวมใน src/main.swift

# ตรวจสอบไฟล์ที่มีข้อขัดแย้ง
git status

# เปิด mergetool แบบภาพ
git mergetool

# หลังการแก้ไข — add และ commit
git add src/main.swift
git commit

# ยกเลิกการรวม
git merge --abort

เมื่อใดควรเลือก merge แทน rebase

Merge ดีกว่า rebase ในหลายสถานการณ์สำคัญ ประการแรก: เมื่อทำงานกับสาขาสาธารณะที่นักพัฒนาคนอื่นเข้าถึงได้ Merge ไม่เขียนประวัติใหม่ ดังนั้นเพื่อนร่วมงานสามารถซิงโครไนซ์ได้อย่างปลอดภัย การทำ rebase ในสาขาสาธารณะจะสร้างประวัติที่แตกต่างและทำให้เกิดข้อขัดแย้งกับทุกคนที่มี commit เก่าอยู่แล้ว

สถานการณ์ที่สอง: เมื่อเสร็จสิ้นสาขาคุณสมบัติ ทีมส่วนใหญ่ชอบ merge (ด้วยแฟล็ก --no-ff) ไปยัง main เพื่อบันทึกช่วงเวลาการรวมคุณสมบัติ ซึ่งช่วยให้การนำทางประวัติง่ายขึ้นและช่วยให้ย้อนกลับคุณสมบัติทั้งหมดได้ง่ายด้วย git revert เพียงครั้งเดียวของ commit การรวม GitHub Flow โดยค่าเริ่มต้นเสนอสามตัวเลือก merge: merge แบบง่าย, squash merge และ rebase merge

สถานการณ์ที่สาม: เมื่อทำงานกับ pull request ที่ผ่านการตรวจสอบแล้ว GitHub และ GitLab เสนอปุ่ม merge พร้อมตัวเลือกต่าง ๆ Merge (Create a merge commit) — ประวัติเต็มพร้อม commit การรวม Squash and merge — ประวัติที่สะอาดไม่มีรายละเอียดการพัฒนา Rebase and merge — ประวัติเชิงเส้นโดยไม่มี commit การรวม แต่มีการเขียน commit ใหม่ การเลือกขึ้นอยู่กับกฎของทีม

  • สาขาสาธารณะ (main, develop) — merge เท่านั้น ไม่เคย rebase
  • การเสร็จสิ้น PR — merge ด้วย --no-ff เพื่อระบุจุดรวม
  • สาขาที่มี commit ของผู้อื่น — merge ไม่เขียนงานของผู้อื่นซ้ำ
  • ก่อนเผยแพร่ — merge ปลอดภัยกว่าเนื่องจากมีความเสี่ยงน้อยกว่า
  • สาขาที่ใช้ร่วมกัน — หากนักพัฒนาหลายคนทำงานบนสาขาเดียว merge เป็นสิ่งจำเป็น

แนวปฏิบัติที่ดีที่สุดสำหรับการรวมสาขา

กฎข้อแรก: ควรอยู่ในเวอร์ชันล่าสุดของสาขาปลายทางเสมอก่อนการรวม รัน git checkout main && git pull ก่อนรวมสาขาคุณสมบัติ ซึ่งช่วยลดข้อขัดแย้งและรับประกันว่า commit การรวมมีการเปลี่ยนแปลงล่าสุดทั้งหมด หากสาขาปลายทางก้าวหน้าไปมาก ให้รัน git merge main ภายในสาขาคุณสมบัติก่อนเพื่อแก้ไขข้อขัดแย้งในบริบทของมัน

กฎข้อที่สอง: ทดสอบโค้ดหลังจากการรวม การรวมสามารถเปลี่ยนพฤติกรรมได้แม้ไม่มีข้อขัดแย้ง CI/CD pipeline ควรรันทดสอบบน commit การรวมก่อนส่งไปยังโปรดักชัน บางทีมใช้ merge gates — การตรวจสอบบังคับที่ปิดกั้นการรวมจนกว่าจะผ่าน

กฎข้อที่สาม: จัดทำเอกสาร commit การรวม ข้อความมาตรฐาน “Merge branch 'feature' into main” มีประโยชน์ไม่มากนัก แนะนำให้เพิ่มคำอธิบายเกี่ยวกับสิ่งที่ถูกรวม: “Merge authentication module: login, registration, password recovery” ซึ่งช่วยให้การวิเคราะห์ประวัติและการค้นหาถดถอยง่ายขึ้น ในโครงการขนาดใหญ่ commit การรวมจะถูกสร้างโดยอัตโนมัติจากชื่อ PR

  • ความทันสมัย — ก่อนการรวม ตรวจสอบให้แน่ใจว่าสาขาปลายทางอัปเดตแล้ว (git pull)
  • การทดสอบ — CI/CD ควรรันทดสอบบน commit การรวมที่ได้
  • ข้อความอธิบาย — ระบุใน commit การรวมว่าคุณสมบัติใดถูกรวม
  • ความถี่ — รวมสาขาคุณสมบัติให้เร็วและบ่อยเท่าที่เป็นไปได้ (สูงสุดหนึ่งสัปดาห์)
  • การย้อนกลับ — git revert ของ commit การรวมจะย้อนกลับคุณสมบัติทั้งหมด

คำถามที่พบบ่อย

การรวมสาขาใน Git หมายความว่าอย่างไร

การรวม หมายถึงการรัน git merge เพื่อรวมการเปลี่ยนแปลงจากสาขาหนึ่งไปยังอีกสาขาหนึ่ง ผลลัพธ์คือ commit การรวมที่บันทึกเหตุการณ์การรวมและมีการเปลี่ยนแปลงจากทั้งสองสาขา นี่เป็นวิธีหลักในการรวมสาขาคุณสมบัติเข้าไปยัง main, develop หรือ release ใน Git Flow

Squash merge แตกต่างจาก merge ปกติอย่างไร

Squash merge รวม commit ทั้งหมดของสาขาคุณสมบัติเป็น commit เดียวในสาขาปลายทาง ทำให้สูญเสียประวัติการพัฒนาระหว่างกลาง Merge ปกติ สร้าง commit การรวมในขณะที่เก็บรักษา commit ทั้งหมดของสาขาคุณสมบัติไว้ Squash merge ให้ประวัติที่สะอาด แต่ไม่อนุญาตให้ติดตามการพัฒนาคุณสมบัติทีละขั้นตอน

วิธีแก้ไขข้อขัดแย้งของ merge ใน Git

เปิดไฟล์ที่มีข้อขัดแย้ง หาส่วนที่มีเครื่องหมาย <<<<<<< HEAD และ >>>>>>> แก้ไขเนื้อหา โดยเก็บบรรทัดที่ต้องการจากทั้งสองเวอร์ชัน ลบเครื่องหมาย บันทึกไฟล์ รัน git add และ git commit คุณสามารถใช้ git mergetool สำหรับการแก้ไขด้วยภาพ

เมื่อใดควรใช้ merge แทน rebase

Merge ใช้สำหรับสาขาสาธารณะ (main, develop, release) เสมอ เพราะไม่เขียนประวัติใหม่ Rebase ใช้ในสาขาคุณสมบัติส่วนตัวก่อนการเผยแพร่ เมื่อสาขากลายเป็นส่วนหนึ่งของที่เก็บที่ใช้ร่วมกันและเพื่อนร่วมงานเข้าถึงแล้ว อนุญาตเฉพาะ merge เท่านั้น

วิธียกเลิก merge ใน Git

ก่อนการรวมเสร็จสมบูรณ์ (ระหว่างข้อขัดแย้ง) — git merge --abort ยกเลิกการรวมทั้งหมด หลังจากเสร็จสมบูรณ์ — git revert <merge-commit-hash> -m 1 สร้าง commit การยกเลิก แฟล็ก -m 1 ระบุว่าควรเก็บสาขาหลักใด (สาขาปลายทาง) Git revert ปลอดภัยกว่า git reset สำหรับสาขาที่เผยแพร่แล้ว

สรุป

  • Merge (การรวม) — การรวมสาขาที่ปลอดภัยซึ่งรักษาประวัติและสร้าง commit การรวมที่มี parent สองตัว
  • โหมดการรวม — ปกติ (--no-ff), squash (--squash) และ fast-forward (--ff) สำหรับวัตถุประสงค์ที่แตกต่างกัน
  • กลยุทธ์ — recursive (ค่าเริ่มต้น), octopus (3+ สาขา), ours (ไม่สนใจการเปลี่ยนแปลงภายนอก)
  • ข้อขัดแย้ง — แก้ไขด้วยตนเองโดยการแก้ไขส่วนที่ทำเครื่องหมายหรือใช้ mergetool
  • ความปลอดภัย — merge ไม่เปลี่ยนแปลง commit ที่มีอยู่ จึงปลอดภัยสำหรับสาขาสาธารณะ
  • Squash merge — รวม commit ทั้งหมดเป็นหนึ่งเดียว สูญเสียประวัติการพัฒนาระหว่างกลาง
  • การยกเลิก merge — git revert ของ commit การรวมด้วยแฟล็ก -m 1 สำหรับการย้อนกลับการเปลี่ยนแปลงที่เผยแพร่อย่างปลอดภัย

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม