Back to notes
foundations-tools
Featured

Advanced Git Mastery: จัดการประวัติศาสตร์โค้ดระดับ Senior

เลิกกลัวการแก้ Conflict! เรียนรู้การทำ Rebase, Cherry-pick และ Stash เพื่อจัดการ Git History ให้สวยงามระดับมือโปร

January 30, 20262 min read readNNexis by Seereen

🛑 1. The Problem First: "เส้นประสาท" (Merge Hell)

จูเนียร์ส่วนใหญ่มักจะใช้แค่ git pull และ git merge ตลอดเวลา:

HLJS BASH
# ❌ ผลลัพธ์: กราฟ 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:

  1. Selection: สั่ง git rebase -i HEAD~3 เพื่อเลือก 3 ตอนล่าสุดที่เขียน
  2. Squash: เปลี่ยนคำว่า pick เป็น s (squash) เพื่อรวม "fix typo" และ "fix again" เข้ากับตอนหลัก
  3. Reword: แก้ไขชื่อเรื่องตอนให้ดูเป็นมืออาชีพ (เช่น "feat: add user login validation")
  4. Result: ประวัติศาสตร์จะเหลือแค่ตอนเดียวที่สมบูรณ์แบบ!
HLJS BASH
# ✅ Best Practice: อัปเดตโค้ดตัวเองตาม Main เสมอเพื่อลด Conflict
git fetch origin
git rebase origin/main # 🛠 ยกงานเราไปต่อท้ายคนอื่น (กราฟสวยเป็นเส้นตรง)

🪤 4. The Junior Trap: ระเบิดเวลาของ force push

จูเนียร์มักจะเผลอใช้ git push --force หลังจากทำ Rebase ใน Shared Branch (Branch ที่คนอื่นใช้ร่วมกัน):

HLJS BASH
# ❌ 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 / MainFeature Branch ของตัวเอง

🎓 6. Senior Mindset Summary

การเป็น Senior คือการมองว่า "Git History คือเอกสารสำคัญของโปรเจกต์" ไม่ใช่แค่ที่เก็บไฟล์ ดังนั้นเราต้องดูแลรักษาให้มันสะอาด อ่านง่าย เพื่อให้คนรุ่นหลัง (หรือตัวเราเองใน 6 เดือนข้างหน้า) ไม่งงเวลาต้องย้อนกลับไปไล่หาประวัติครับ!

Share this note

Mission Accomplished

You've reached the end of this module. Time to apply these senior mindsets to your real-world projects!

Explore more topics

Related notes

View all notes

© 2026 My Notes by Seereen