Rebase คือการดำเนินการใน Git ที่ย้ายลำดับของคอมมิตไปยังคอมมิตฐานใหม่ โดยเขียนประวัติของสาขาใหม่ ต่างจาก Merge ตรงที่ Rebase ไม่ได้สร้างคอมมิตการรวม แต่ใช้คอมมิตซ้ำบนสถานะปัจจุบันของสาขาปลายทาง ตามข้อมูลจาก git-scm.com, 2026 มีการใช้ rebase ใน 58% ของโปรเจกต์ Git เพื่อรักษาประวัติคอมมิตเชิงเส้นที่สะอาด
ประเด็นสำคัญ
Rebase (การรีเบส) คือการดำเนินการใน Git ที่ย้ายคอมมิตจากสาขาปัจจุบันไปยังจุดฐานใหม่ แทนที่จะสร้างคอมมิตการรวม rebase จะนำแต่ละคอมมิตจากสาขาต้นทางมาใช้ทีละตัวบนฐานใหม่ ผลลัพธ์คือลำดับคอมมิตเชิงเส้นที่ไม่มีการแตกสาขา
ชื่อ rebase มาจาก “re-base” — การเปลี่ยนฐาน ในขณะที่ merge รวมสองสาขาที่จุดเดียว rebase จะย้ายสาขาทั้งหมดของคุณไปยังตำแหน่งใหม่ ทำให้ดูเหมือนว่าคุณเริ่มพัฒนาจากสถานะปัจจุบันของสาขาปลายทาง สิ่งนี้สร้างภาพลวงตาของงานที่เรียงลำดับอย่างสมบูรณ์แบบ
ตามข้อมูลของ Atlassian, 2025 ทีมที่ใช้ rebase สำหรับสาขาคุณสมบัติใช้เวลาในการวิเคราะห์ประวัติคอมมิตน้อยกว่า 30% เมื่อเทียบกับทีมที่ใช้ merge เพียงอย่างเดียว ประวัติเชิงเส้นทำให้ git blame, bisect และการดู log ผ่าน git log --oneline ง่ายขึ้น
Merge รวมสาขาโดยการสร้างคอมมิตที่มีพ่อแม่สองคน Rebase เขียนประวัติใหม่: คอมมิตใหม่ถูกสร้างขึ้นด้วยแฮชใหม่ แม้ว่าการเปลี่ยนแปลงจะเหมือนกับต้นฉบับ ซึ่งหมายความว่า rebase เปลี่ยนตัวระบุ SHA ของคอมมิต ซึ่งสำคัญสำหรับสาขาสาธารณะ
กลไกของ rebase ประกอบด้วยสี่ขั้นตอน: Git หาบรรพบุรุษร่วม (merge base) ของสาขาปัจจุบันและสาขาปลายทาง จากนั้นใช้คอมมิตแต่ละตัวของสาขาปัจจุบันบนสาขาปลายทางตามลำดับ หากเกิดข้อขัดแย้งในขั้นตอนใด rebase จะหยุดและรอการแก้ไข
# สถานการณ์เริ่มต้น: สาขา feature ตามหลัง develop อยู่ 3 คอมมิต
git checkout feature/new-login
git rebase develop
# Git นำ 3 คอมมิตจาก feature และใช้บน develop
# หากไม่มีข้อขัดแย้ง — rebase จะเสร็จสมบูรณ์โดยอัตโนมัติ
# หากมี — Git จะหยุดที่คอมมิตที่มีข้อขัดแย้ง
หลังจาก rebase สาขาคุณสมบัติ จะมีคอมมิตทั้งหมดจาก develop บวกกับคอมมิตของตัวเอง ซึ่งปรากฏเป็นส่วนต่อเนื่องของ develop ซึ่งช่วยให้รวมเข้า develop ผ่าน fast-forward โดยไม่ต้องสร้างคอมมิตการรวม
ลองดูตัวอย่างโดยละเอียด: นักพัฒนาสร้างสาขาคุณสมบัติจาก develop ทำสองคอมมิต ในขณะที่นักพัฒนาคนอื่นเพิ่มสามคอมมิตใน develop Rebase จะย้ายสองคอมมิตของคุณสมบัติไปยังตำแหน่งใหม่ สร้างสำเนาด้วย SHA ใหม่
# 1. สร้างสาขา feature
git checkout -b feature/payment-refactor develop
# 2. ทำคอมมิตใน feature
git commit -m "refactor: extract payment validation"
git commit -m "refactor: add payment gateway interface"
# 3. อัปเดต develop (งานของเพื่อนร่วมทีม)
git checkout develop
git pull
# 4. Rebase feature บน develop ใหม่
git checkout feature/payment-refactor
git rebase develop
# 5. ตอนนี้ feature สามารถรวมผ่าน fast-forward
git checkout develop
git merge feature/payment-refactor
หากเกิดข้อขัดแย้งในขั้นตอนที่ 4 Git จะหยุดที่คอมมิตที่มีปัญหา นักพัฒนาแก้ไขข้อขัดแย้ง รัน git add และดำเนินการ git rebase --continue เพื่อข้ามคอมมิต — git rebase --skip เพื่อยกเลิก rebase ทั้งหมด — git rebase --abort
แฟล็ก --empty ควบคุมพฤติกรรมของ rebase กับคอมมิตว่าง — สถานการณ์ที่การเปลี่ยนแปลงทั้งหมดของคอมมิตอยู่ในสาขาปลายทางแล้ว โดยค่าเริ่มต้น rebase จะหยุดและขอการตัดสินใจ ด้วย --empty=drop Git จะข้ามคอมมิตเหล่านั้นโดยอัตโนมัติโดยไม่หยุด ซึ่งช่วยเร่งการรีเบสจำนวนมากที่มีคอมมิตจำนวนมาก
Rebase แบบโต้ตอบ (git rebase -i) เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการแก้ไขประวัติคอมมิต มันเปิดโปรแกรมแก้ไขพร้อมรายการคอมมิตและคำสั่งสำคัญ: pick (เก็บไว้), reword (เปลี่ยนข้อความ), edit (เปลี่ยนเนื้อหา), squash (รวมกับคอมมิตก่อนหน้า), fixup (รวมโดยไม่ต้องมีข้อความ), drop (ลบ)
# Rebase แบบโต้ตอบของ 4 คอมมิตล่าสุด
git rebase -i HEAD~4
# โปรแกรมแก้ไขจะเปิดพร้อมแผน rebase:
# pick a1b2c3 feat: add login screen
# pick d4e5f6 fix: login validation
# pick g7h8i9 fix: login layout
# pick j0k1l2 docs: add login comments
# เปลี่ยนเป็น:
# pick a1b2c3 feat: add login screen
# squash d4e5f6 fix: login validation
# squash g7h8i9 fix: login layout
# drop j0k1l2 docs: add login comments
ผลลัพธ์: สามคอมมิต (หน้าจอเข้าสู่ระบบ, การตรวจสอบ, เค้าโครง) ถูกบีบอัดเป็นหนึ่งเดียว และคอมมิตที่มีความคิดเห็นถูกลบ ซึ่งช่วยให้ส่งประวัติที่สะอาดสำหรับการตรวจสอบโค้ดโดยไม่มีร่างและการแก้ไข Rebase แบบโต้ตอบเป็นเครื่องมือมาตรฐานสำหรับการเตรียมสาขาคุณสมบัติก่อน Pull Request
Rebase และ Merge แก้ปัญหาเดียวกัน — การรวมการเปลี่ยนแปลง — แต่ในวิธีที่แตกต่างกันโดยพื้นฐาน การเลือกระหว่างพวกมันขึ้นอยู่กับประเภทของประวัติที่คุณต้องการเห็นใน git log และใครอีกบ้างที่ทำงานกับสาขาของคุณ
| เกณฑ์ | Merge | Rebase |
|---|---|---|
| ประวัติ | คงการแตกสาขา | เชิงเส้น ไม่มีสาขา |
| คอมมิตการรวม | ถูกสร้าง (ยกเว้น ff) | ไม่ถูกสร้าง |
| SHA คอมมิต | ไม่เปลี่ยนแปลง | ถูกสร้างใหม่ |
| ความปลอดภัย | ปลอดภัยสำหรับสาขาสาธารณะ | อันตราย — เขียนประวัติใหม่ |
| ความอ่านได้ของ log | กราฟการแตกสาขา | เส้นตรง |
| git bisect | สะดวก — เห็นจุดรวม | สะดวก — ลำดับเชิงเส้น |
กฎปฏิบัติ: ใช้ merge สำหรับการรวมเข้ากับสาขาที่ใช้ร่วมกัน (develop, main) และ rebase สำหรับการอัปเดตสาขาคุณสมบัติส่วนตัว หลายทีมรวมทั้งสองอย่าง: rebase คุณสมบัติบน develop จากนั้น --no-ff merge เข้า develop
Git bisect เป็นเครื่องมือสำหรับค้นหาคอมมิตที่ทำให้เกิดการถดถอย เมื่อใช้ merge git bisect จะผ่านคอมมิตการรวมอย่างถูกต้องโดยพิจารณาทั้งพ่อแม่สองคน ด้วย rebase bisect ทำงานเร็วขึ้นเพราะประวัติเป็นเชิงเส้นและไม่ต้องการการแตกสาขา อย่างไรก็ตาม หาก rebase เกิดขึ้นหลังจากที่คอมมิตเป็นที่รู้จักของทีม SHA ดั้งเดิมจะหายไปและ bisect อาจไม่พบคอมมิตที่มีปัญหา
Rebase เหมาะที่สุดในสามสถานการณ์: การเตรียมสาขาคุณสมบัติสำหรับ Pull Request การอัปเดตสาขาส่วนตัวให้เป็นสถานะปัจจุบันของ main/develop และการทำความสะอาดประวัติก่อนการรวม ในแต่ละกรณี rebase ช่วยเพิ่มความอ่านได้ของประวัติโดยไม่มีความเสี่ยงต่อการทำงานเป็นทีม
ก่อนPull Request แนะนำให้ทำ rebase แบบโต้ตอบเพื่อรวมคอมมิตแบบร่าง (WIP, การแก้ไขหลังการตรวจสอบ) เป็นหน่วยตรรกะที่มีความหมาย ซึ่งช่วยให้การตรวจสอบโค้ดง่ายขึ้น: ผู้ตรวจสอบเห็นไม่ใช่ 15 คอมมิตเล็ก ๆ แต่เป็นการเปลี่ยนแปลงที่มีโครงสร้าง 3-5 รายการพร้อมข้อความที่ชัดเจน
สำหรับการอัปเดตสาขาคุณสมบัติ rebase ดีกว่า merge เพราะมันไม่สร้างคอมมิตการรวมที่ไม่จำเป็น หากคุณรัน git rebase develop เป็นระยะภายในสาขาคุณสมบัติ การรวมสุดท้ายจะไม่มีคอมมิตการรวม 10 ตัว — มีเพียงคอมมิตคุณสมบัติที่สะอาดบน develop
การทำความสะอาดประวัติ ผ่าน rebase แบบโต้ตอบก่อนการรวมช่วยให้ซ่อนการแก้ไขเล็กน้อย (การพิมพ์ผิด, การจัดรูปแบบ) และจัดกลุ่มคอมมิตตามฟังก์ชันการทำงาน ข้อความ Git ควรปฏิบัติตามข้อตกลง Conventional Commits (fix:, feat:, refactor:, docs:) ซึ่งสร้าง changelog อัตโนมัติ
Rebase เป็นการดำเนินการที่อันตรายหากใช้ผิดวิธี ความเสี่ยงหลักคือการเขียนประวัติที่เผยแพร่แล้วซ้ำ หากนักพัฒนา rebase สาขาที่คนอื่น push ไว้แล้วและกำลังใช้อยู่ สำเนาท้องถิ่นของพวกเขาจะไม่ตรงกันและพวกเขาจะต้องทำ force-pull ด้วยความเสี่ยงที่จะสูญเสียข้อมูล
เพื่อลดความเสี่ยง ให้ปฏิบัติตามกฎนี้: rebase เฉพาะสาขาส่วนตัวที่ยังไม่ได้เผยแพร่ หากสาขาอยู่ในที่เก็บร่วมกันแล้ว ให้ใช้ merge กับ --no-ff หากคุณต้องการ rebase สาขาที่เผยแพร่แล้ว ให้แจ้งทีมและประสานงาน force push ล่วงหน้า
การป้องกันอัตโนมัติ ต่อ rebase ที่อันตรายถูกนำไปใช้ผ่าน hooks ฝั่งเซิร์ฟเวอร์: pre-receive hook บนเซิร์ฟเวอร์ Git สามารถตรวจสอบว่า push เขียนคอมมิตที่เผยแพร่แล้วซ้ำหรือไม่ GitHub และ GitLab มีการป้องกันในตัวสำหรับสาขาที่ได้รับการป้องกัน — force push จะถูกบล็อกจนกว่าผู้ดูแลระบบจะยกเลิกการป้องกัน
คำถามที่พบบ่อย
ประวัติของสาขาจะเปลี่ยนไป — SHA ของคอมมิตจะแตกต่างกัน ทุกคนที่ push สาขานี้แล้วหรือสร้างสาขาลูกจากมันจะพบข้อขัดแย้งเมื่อ git pull การกู้คืนจะต้องมีการแทรกแซงด้วยตนเองและอาจนำไปสู่การสูญเสียคอมมิต
ก่อนเสร็จสมบูรณ์ — git rebase --abort หลังจากเสร็จสมบูรณ์ — ผ่าน git reflog เท่านั้น หาก rebase เพิ่งทำเสร็จ reflog เก็บประวัติการเคลื่อนไหวของ HEAD ซึ่งสามารถใช้กลับไปยังสถานะก่อน rebase: git reset --hard HEAD@{1}
Rebase ย้ายลำดับของคอมมิตไปยังฐานใหม่ Cherry-pick ใช้คอมมิตเฉพาะหนึ่งตัวหรือหลายตัวกับสาขาปัจจุบัน Rebase เป็นอัตโนมัติสำหรับทั้งห่วงโซ่ cherry-pick ต้องการการเลือกคอมมิตแต่ละตัวด้วยตนเอง
แนะนำ แต่ไม่บังคับ Rebase ก่อน PR อัปเดตสาขาให้เป็นสถานะปัจจุบันของ main/develop และทำความสะอาดประวัติ หากสาขาถูกสร้างขึ้นเมื่อเร็ว ๆ นี้และไม่ต้องการการอัปเดต การ rebase แบบโต้ตอบเพื่อทำความสะอาดคอมมิตก็เพียงพอ
แท็กจะไม่ถูกย้าย ระหว่าง rebase หากคอมมิตที่ถูกรีเบสมีแท็ก แท็กนั้นจะยังคงอยู่บนคอมมิตเก่าที่ไม่ได้เป็นส่วนหนึ่งของประวัติสาขาแล้ว แนะนำว่าไม่ควรแท็กคอมมิตบนสาขาคุณสมบัติ เฉพาะบน main เท่านั้น
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม