PlusMagi's Blog By Pitt Phunsanit GIT,Programming,system,technology Git: Internals: แอบดูหลังบ้าน Git ว่าเก็บข้อมูล Blob, Tree, Commit และ Tag อย่างไร

Git: Internals: แอบดูหลังบ้าน Git ว่าเก็บข้อมูล Blob, Tree, Commit และ Tag อย่างไร

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


เจาะลึกรายละเอียดและประเด็นสำคัญ

หัวใจหลักของ Git ไม่ได้อยู่ที่การเก็บไฟล์ แต่เป็นการเก็บ “วัตถุ” (Objects) ซึ่งมี 4 ประเภทหลักที่ทำงานร่วมกันเพื่อสร้างโครงสร้างข้อมูลแบบ Directed Acyclic Graph (DAG) เริ่มต้นจากระดับล่างสุดคือ Blob ซึ่งเป็นเพียงเนื้อหาของไฟล์ดิบๆ โดยไม่มีข้อมูลชื่อหรือเมตาดาต้าใด ๆ ตามมา เมื่อเราต้องการจัดระเบียบ Blob เหล่านี้ เราจะใช้ Tree Object ซึ่งทำหน้าที่เหมือนไดเรกทอรี มันเก็บรายการของ Blobs และ Trees อื่น ๆ พร้อมทั้งกำหนดว่าไฟล์เหล่านั้นมีชื่ออะไรและอยู่ในตำแหน่งใด ทำให้ Git รู้โครงสร้างทั้งหมดของ Snapshot ณ เวลาหนึ่ง

เมื่อเราได้ Tree ที่สมบูรณ์แล้ว เราจึงใช้ Commit Object ซึ่งทำหน้าที่เป็นจุดบันทึก (Snapshot) มันไม่ได้เก็บโค้ดทั้งหมด แต่จะเก็บเพียงแค่ Pointer ไปยัง Root Tree ของ Snapshot นั้น ๆ พร้อมกับข้อมูลเมตาดาต้าสำคัญ เช่น ผู้สร้าง วันที่ และข้อความ Commit ที่อธิบายการเปลี่ยนแปลง นอกจากนี้ Tag ก็เป็นอีกหนึ่ง Object ที่ทำหน้าที่เหมือนป้ายกำกับ (Label) เพื่อระบุจุดสำคัญในประวัติศาสตร์ เช่น เวอร์ชัน Release v1.0 ซึ่ง Tag จะชี้ไปยัง Commit ID โดยตรง ทำให้เราสามารถอ้างถึงสถานะที่แน่นอนได้แม้ว่าเวลาจะผ่านไปนานแค่ไหน


การนำไปประยุกต์ใช้ในชีวิตและการทำงานยุคใหม่

  • การทำความเข้าใจ Object Model อย่างลึกซึ้ง: การรู้ว่า Git เก็บข้อมูลเป็น Blob/Tree จะช่วยให้เราสามารถเขียน Script หรือเครื่องมือที่ทำงานกับ Git ได้อย่างมีประสิทธิภาพมากขึ้น เช่น การสร้างระบบตรวจสอบความสมบูรณ์ของ Repository (Integrity Check) โดยการวนลูป Hash ของทุก Object เพื่อยืนยันว่าไม่มีข้อมูลสูญหายหรือถูกแก้ไขโดยไม่ตั้งใจ
  • การจัดการ Branching และ Merging ที่ซับซ้อน: เมื่อเข้าใจว่า Commit คือ Pointer ไปยัง Tree ทำให้เราเห็นภาพชัดเจนว่า Branch ต่าง ๆ ไม่ได้เป็นการคัดลอกไฟล์ แต่เป็นการสร้างเส้นทาง (Pointer) ใหม่ที่ชี้ไปยังจุดบันทึกต่างกัน การทำ Merge จึงเป็นเพียงการรวมรายการของ Parent Commits เข้าด้วยกันอย่างมีระเบียบ

ท้ายที่สุดแล้ว ความเข้าใจใน “กลไกภายใน” ของเครื่องมือที่เราใช้ทุกวัน ไม่ว่าจะเป็น Git หรือระบบฐานข้อมูลใด ๆ คือการยกระดับจากผู้ใช้งาน (User) ไปสู่ระดับสถาปนิก (Architect) การรู้ว่า Blob, Tree, Commit และ Tag ทำงานร่วมกันอย่างไร ไม่เพียงแต่ทำให้เราสามารถแก้ไขปัญหาที่ซับซ้อนที่สุดได้เท่านั้น แต่ยังช่วยให้เราออกแบบ Workflow ของทีมได้อย่างแข็งแกร่งและยั่งยืนตามหลักการของระบบคอมพิวเตอร์อย่างแท้จริง


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

Exit mobile version