🛑 1. The Problem First: "เส้นประสาท" (Merge Hell)
จูเนียร์ส่วนใหญ่มักจะใช้แค่ git pull และ git merge ตลอดเวลา:
# ❌ ผลลัพธ์: กราฟ Git ที่เหมือนสายไฟพันกัน
* Merge branch 'main' into feature-A
* fix typo
* test again
* Merge branch 'main' into feature-A
* work in progress
ปัญหา: เมื่อทีมใหญ่ขึ้นและทุกคนทำ Merge Commit ตลอดเวลา ประวัติศาสตร์ของโปรเจกต์จะอ่านยากมาก! คุณจะหาไม่เจอว่า "บั๊กนี้เกิดขึ้นที่ Commit ไหน?" เพราะมันมีเส้นสายพันกันมั่วไปหมด นี่คือความเจ็บปวดที่เรียกว่า "Messy History" ครับ
💡 2. Real-Life Analogy: การเขียนหนังสือร่วมกัน
ลองนึกภาพว่าคุณและเพื่อนกำลัง "แต่งนิยายคนละตอน".
- Merge: คือการที่เพื่อนเขียนเสร็จแล้วเอาหน้ากระดาษของเขามาแปะทับหน้ากระดาษของคุณ แล้วเขียนโน้ตแปะไว้ว่า "รวมกันแล้วนะ" (เห็นรอยต่อชัดเจน)
- Rebase: คือการที่คุณดูว่าคนอื่นเขียนถึงหน้าไหนแล้ว แล้วคุณ "ยกตอนที่คุณเขียนไปเริ่มต่อจากหน้าล่าสุดของเขา" ทำให้เนื้อเรื่องรันยาวเป็นเส้นตรงเหมือนเขียนมาจากคนเดียว
- Cherry-pick: คือการที่คุณเห็น "ประโยคเด็ด" (Commit) ในนิยายของเพื่อน แล้วคุณอยากก๊อปปี้แค่ประโยคนั้นมาใส่ในตอนของคุณเองตัวเดียว
🚀 3. Execution Journey: ขั้นตอนการจัดระเบียบสังคม
เมื่อคุณต้องการทำความสะอาด Commit ก่อนส่งงาน (Interactive Rebase):
🛠 Step-by-step:
- Selection: สั่ง
git rebase -i HEAD~3เพื่อเลือก 3 ตอนล่าสุดที่เขียน - Squash: เปลี่ยนคำว่า
pickเป็นs(squash) เพื่อรวม "fix typo" และ "fix again" เข้ากับตอนหลัก - Reword: แก้ไขชื่อเรื่องตอนให้ดูเป็นมืออาชีพ (เช่น "feat: add user login validation")
- Result: ประวัติศาสตร์จะเหลือแค่ตอนเดียวที่สมบูรณ์แบบ!
# ✅ Best Practice: อัปเดตโค้ดตัวเองตาม Main เสมอเพื่อลด Conflict
git fetch origin
git rebase origin/main # 🛠 ยกงานเราไปต่อท้ายคนอื่น (กราฟสวยเป็นเส้นตรง)
🪤 4. The Junior Trap: ระเบิดเวลาของ force push
จูเนียร์มักจะเผลอใช้ git push --force หลังจากทำ Rebase ใน Shared Branch (Branch ที่คนอื่นใช้ร่วมกัน):
# ❌ Junior Trap: แก้ประวัติศาสตร์กลางวง
git push -f origin team-feature
ระวัง: การทำแบบนี้คือการ "ลบงานเพื่อนทิ้ง" ทันที! เพราะประวัติศาสตร์ในเครื่องเพื่อนกับ Server จะไม่ตรงกันอีกต่อไป เพื่อนจะดันงานไม่ได้และ Conflict จะบะลักกั๊ก ✅ การแก้ไข: ห้าม Rebase และ Force Push ใน Branch ส่วนกลางเด็ดขาด! ให้ทำแค่ใน Branch ส่วนตัวของเราเท่านั้น
⚖️ 5. The Why Matrix: Merge vs Rebase
| หัวข้อ | Merge (ปลอดภัย) | Rebase (สวยงาม) |
|---|---|---|
| ความง่าย | ง่ายมาก (แค่กดยอมรับ) | ต้องระวัง (แก้ประวัติศาสตร์) |
| ประวัติศาสตร์ | กราฟยุ่งเหยิง (มีรอยต่อ) | กราฟสวยเป็นเส้นตรง (สะอาด) |
| การแก้ Conflict | แก้ครั้งเดียวตอนท้าย | แก้ทีละจุดระหว่างย้าย (เหนื่อยกว่า) |
| ความเหมาะสม | Shared Branch / Main | Feature Branch ของตัวเอง |
🎓 6. Senior Mindset Summary
การเป็น Senior คือการมองว่า "Git History คือเอกสารสำคัญของโปรเจกต์" ไม่ใช่แค่ที่เก็บไฟล์ ดังนั้นเราต้องดูแลรักษาให้มันสะอาด อ่านง่าย เพื่อให้คนรุ่นหลัง (หรือตัวเราเองใน 6 เดือนข้างหน้า) ไม่งงเวลาต้องย้อนกลับไปไล่หาประวัติครับ!
Mission Accomplished
You've reached the end of this module. Time to apply these senior mindsets to your real-world projects!