Git Squash: รวม Commit ให้สวยงามก่อน Merge

การ Squash Commit เป็นเทคนิคที่สำคัญในการทำงานกับ Git โดยเฉพาะเมื่อต้องการรวม Commit หลายตัวให้เป็น Commit เดียว ก่อนทำการ Merge ลงสาขา Main หรือ Develop ในบทความนี้เราจะศึกษาวิธีการ Squash Commit การประยุกต์ใช้ในงาน Development และ Best Practices ต่างๆ ที่ช่วยให้ Git History เรียบร้อยและง่ายต่อการติดตาม โดยเฉพาะสำหรับผู้ที่ทำงานกับ ผู้ให้บริการโฮสติ้ง Cloud VPS หรือเซิร์ฟเวอร์บนระบบ Linux

Git Squash คืออะไร

Git Squash คือการรวม Commit หลายตัวให้เป็นตัวเดียว เพื่อให้ Git History มีความเรียบร้อยและสะอาด ตัวอย่างเช่น หากคุณมี Commit 5 ตัวในการแก้ไข Feature เดียว คุณสามารถ Squash ทั้ง 5 ตัวให้เป็น 1 Commit ที่มีข้อความสรุปที่ดี โดยปกติในงาน Development ทั่วไป Developer มักจะ Commit หลายครั้งในช่วงระยะเวลาสั้นๆ เพื่อติดตามความคืบหน้าของการทำงาน แต่เมื่อต้องนำผลงานมารวมกับสาขา Main ก็ควรทำการ Squash เพื่อให้ Git Log ของ Production Branch มีความสะอาด

ประโยชน์ของ Squashing คือ:

  • ทำให้ Git History สะอาดและอ่านง่าย โดยลดจำนวน Commit ที่ไม่จำเป็น
  • ลดจำนวน Commit ที่ไม่จำเป็นในสาขา Main ทำให้ Repository มีความน่าอ่าน
  • ทำให้ Code Review ง่ายขึ้น เนื่องจาก Reviewer สามารถเห็นภาพรวมของการเปลี่ยนแปลง
  • ช่วยในการ Bisect เพื่อหา Bug ได้อย่างมีประสิทธิภาพมากขึ้น
  • เพิ่มความน่าอ่านของประวัติการเปลี่ยนแปลง และสะดวกในการเข้าใจเจตนาของแต่ละ Commit
  • ป้องกันการกระจัดกระจายของข้อมูลในเมื่อทำการ Revert หรือ Cherry-pick

วิธีการ Squash Commit ด้วย Git Rebase

วิธีที่ง่ายที่สุดในการ Squash Commit คือใช้คำสั่ง Git Interactive Rebase สมมติว่าคุณต้องการรวม 4 Commit ล่าสุด ให้ใช้คำสั่ง:

git rebase -i HEAD~4

คำสั่งนี้จะเปิด Editor แสดง 4 Commit ล่าสุด ตามด้วยรายการ Action ที่สามารถทำได้:

pick abcdef1 Fix header alignment
pick bcdefg2 Update CSS styling
pick cdefgh3 Fix mobile responsiveness
pick defghi4 Update documentation

เพื่อ Squash Commit ให้คลิกเปลี่ยน Commit ที่สองและต่อไปจาก “pick” เป็น “squash” หรือเพียงแค่ “s”:

pick abcdef1 Fix header alignment
squash bcdefg2 Update CSS styling
squash cdefgh3 Fix mobile responsiveness
squash defghi4 Update documentation

บันทึกไฟล์และปิด Editor Git จะทำการรวม Commit ทั้งหมด จากนั้นจะแสดง Editor ใหม่เพื่อให้คุณแก้ไขข้อความ Commit ที่รวมแล้ว การดำเนินการนี้มีประโยชน์มากสำหรับการเตรียมผลงานก่อนจะส่ง Pull Request ไปยังสาขา Main

แก้ไขข้อความ Commit ที่รวมแล้ว

หลังจากทำการ Squash Commit Git จะรวมข้อความทั้งหมด ในการแก้ไขให้สะอาดขึ้น ให้ลบข้อความเก่าและเขียนใหม่โดยใช้เทมเพลตข้อความ Commit ที่ดี ตามหลักการที่เห็นได้ใน Conventional Commit Message

# ข้อความหลังจาก Squash (รวมข้อความเก่า)
# Fix header alignment
# Update CSS styling
# Fix mobile responsiveness
# Update documentation

เปลี่ยนเป็น:

feat: Improve UI styling and responsiveness for header section

Details of changes made:
- Fixed header alignment issues
- Updated CSS styling for better compatibility
- Fixed mobile responsiveness problems
- Added documentation for styling changes

การเขียนข้อความ Commit ที่มีคุณภาพจะช่วยให้ผู้อื่นเข้าใจจุดประสงค์ของการเปลี่ยนแปลง และสะดวกต่อการค้นหาประวัติในภายหลัง

Squash ก่อน Merge ลงสาขา Main

ในการทำงานแบบ Collaborative Git Workflow มักจะมีการ Squash Commit ก่อน Merge Pull Request เนื่องจากหากเก็บ Commit ทั้งหมดจะทำให้ Git History ยุ่งและยากต่อการอ่าน การทำ Squash นี้เป็นส่วนสำคัญของ Git Merge vs Rebase Strategy ที่หลายทีม Adopt ในการทำงาน

ขั้นตอนการ Squash ก่อน Merge:

  1. สร้าง Feature Branch และทำการแก้ไข Code ตามที่ต้องการ
  2. Commit แต่ละครั้งตามลำดับของการทำงาน เพื่อติดตามความคืบหน้า
  3. Push ลงสาขา Remote เพื่อให้ผู้อื่นสามารถ Review ได้
  4. ก่อน Merge ให้ทำการ Squash Commit เพื่อเพิ่มความสะอาด
  5. Push Force ขึ้น Remote (หากเป็น Feature Branch ส่วนตัว เท่านั้น)
  6. Merge ลงสาขา Main และทำการ Clean up Branch

ตัวอย่าง Workflow: Squash ก่อน Merge

# 1. สร้าง Feature Branch
git checkout -b feature/user-auth

# 2. Commit หลายครั้ง
git commit -m "Add login form"
git commit -m "Add validation"
git commit -m "Add error handling"

# 3. Push ขึ้น Remote
git push origin feature/user-auth

# 4. ก่อน Merge ให้ Squash
git rebase -i origin/main
# เลือก pick สำหรับตัวแรก squash สำหรับตัวอื่นๆ

# 5. Push Force
git push origin feature/user-auth --force

# 6. Merge ลงสาขา Main
git checkout main
git merge feature/user-auth
git push origin main

# 7. ลบ Feature Branch
git branch -d feature/user-auth
git push origin --delete feature/user-auth

Best Practices สำหรับ Git Squash

  • เมื่อ Squash: ควร Squash ก่อน Merge Pull Request เพื่อรักษา Main Branch ให้สะอาด และลดความยุ่งในการอ่าน Git Log
  • ข้อความ Commit ที่ดี: เขียนข้อความที่สรุปการเปลี่ยนแปลงทั้งหมดอย่างชัดเจน โดยเป็นไปตามหลักการ Git Flow ที่หลายองค์กรใช้
  • ระวังการ Push Force: ใช้ Push Force เฉพาะ Feature Branch ส่วนตัว ไม่ควร Force Push ลงสาขาที่แชร์กับคนอื่น เพราะอาจทำให้เกิดความสับสน
  • ตรวจสอบก่อน Squash: ให้ตรวจสอบ Commit ที่จะถูก Squash ก่อนทำการ Rebase เพื่อหลีกเลี่ยงการเสียหายของ Code
  • เลือกจำนวน Commit: อย่า Squash เกินไป ควรเก็บ Commit ที่มีความหมายแยกจากกัน เพื่อให้ Git History บอกเล่าเรื่องราวของการพัฒนา
  • ใช้ Squash ในการ Code Review: เมื่อได้รับความเห็นชอบจาก Code Reviewer ให้ทำ Squash ก่อน Merge เพื่อป้องกันการมี Review Comments ที่ไม่จำเป็นในสาขา Main

ความแตกต่างระหว่าง Squash กับ Rebase

Squash และ Rebase เป็นคำสั่งที่เกี่ยวข้อง แต่มีความแตกต่างที่สำคัญ:

  • Squash: รวม Commit หลายตัวให้เป็น Commit เดียว โดยเก็บข้อมูลทั้งหมด เหมาะสำหรับการเตรียม Feature ก่อน Merge
  • Rebase: เปลี่ยน Base ของ Branch ไปยัง Commit อื่น สามารถใช้แบบ Interactive เพื่อแก้ไข Commit ตัดทอน หรือจัดเรียงใหม่ โดยทั่วไปใช้เพื่อให้ Branch อยู่ในแนวเดียวกับ Main Branch

การเข้าใจความแตกต่างนี้จะช่วยให้คุณเลือกใช้เครื่องมือที่เหมาะสมสำหรับสถานการณ์ต่างๆ ในการเตรียม Pull Request ตามหลัก Good Pull Request Practices

การ Squash ในสภาพแวดล้อมการทำงาน ผู้ให้บริการโฮสติ้ง

เมื่อทำงานกับ ผู้ให้บริการโฮสติ้ง Cloud VPS หรือ Cloud Hosting Services คุณสามารถรักษา Code Repository ให้มีคุณภาพสูงโดยการใช้ Git Squash เป็นประจำ การบำรุงรักษา Repository ที่ดีจะช่วยให้การ Deploy และ Maintenance สะดวกยิ่งขึ้น และทำให้ DevOps Team สามารถติดตามการเปลี่ยนแปลงได้ง่ายกว่า

สรุป

Git Squash เป็นเทคนิคที่จำเป็นในการรักษา Git History ให้สะอาดและจัดระเบียบ การใช้งานที่ถูกต้องจะช่วยให้ Code Review ง่ายขึ้น และทำให้ Git Log อ่านง่าย เมื่อทำงานกับ ผู้ให้บริการโฮสติ้ง Cloud VPS หรือ Cloud Hosting การรักษา Code Repository ให้มีคุณภาพจะช่วยให้การ Deploy และ Maintenance สะดวกยิ่งขึ้น และเพิ่มประสิทธิภาพของทีม Development ในระยะยาว