เจาะลึก Git: Objects & Hashing
Git ทำงานได้อย่างรวดเร็วและเชื่อถือได้เนื่องจากวิธีการจัดเก็บข้อมูล หากต้องการเชี่ยวชาญ Git คุณต้องเข้าใจไดเรกทอรี .git โฟลเดอร์ที่ซ่อนอยู่นี้เก็บทุกสิ่งที่ Git จำเป็นต้องใช้ในการติดตามโปรเจกต์ของคุณ
Git ใช้ Object หลัก 4 ประเภทในการจัดการงานของคุณ:
- Blobs: ใช้สำหรับเก็บเนื้อหาของไฟล์
- Trees: ใช้สำหรับเก็บโครงสร้างไดเรกทอรีและชื่อไฟล์
- Commits: ใช้สำหรับเก็บ Snapshot ของโปรเจกต์และ Metadata
- Tags: ใช้สำหรับเก็บการอ้างอิงไปยังเวอร์ชันที่เฉพาะเจาะจง
Git ระบุตัวตนของทุกอย่างด้วยการทำ Hashing โดยใช้อัลกอริทึม SHA-1 เพื่อเปลี่ยนข้อมูลให้เป็น ID ที่ไม่ซ้ำกัน ID นี้ทำหน้าที่เหมือนลายนิ้วมือ หากคุณเปลี่ยนตัวอักษรเพียงตัวเดียวในไฟล์ ค่า Hash จะเปลี่ยนไปโดยสิ้นเชิง
วิธีที่ Git สร้าง Snapshot:
เมื่อคุณ Commit ไฟล์ Git จะสร้างสายโซ่ของ Object ขึ้นมา
- Blob จะเก็บข้อความหรือข้อมูลจริงที่อยู่ในไฟล์ของคุณ
- Tree จะจับคู่ Blob นั้นเข้ากับชื่อไฟล์และเส้นทางโฟลเดอร์ที่เฉพาะเจาะจง
- Commit จะเชื่อมโยง Tree เข้ากับผู้เขียน (Author), เวลา (Timestamp) และข้อความ (Message)
Git ไม่ได้เก็บเฉพาะส่วนที่เปลี่ยนแปลงหรือ "deltas" แต่จะเก็บเป็น Snapshot ทุกครั้งที่คุณ Commit, Git จะสร้าง Object ใหม่ขึ้นมา สิ่งนี้ทำให้ประวัติ (History) ของคุณไม่สามารถเปลี่ยนแปลงได้ (Immutable) และกู้คืนได้ง่าย
การเข้าใจโครงสร้างนี้จะช่วยให้คุณแก้ไขข้อผิดพลาด กู้คืนข้อมูลที่สูญหาย และจัดการ Branch ที่ซับซ้อนได้
ลองทำโปรเจกต์เล็กๆ นี้เพื่อดูการทำงานจริง:
เริ่มต้น Repository:
mkdir git-labcd git-labgit initสร้างไฟล์และหาค่า Hash ของมัน:
echo 'Hello Git' > hello.txtgit hash-object hello.txtเก็บไฟล์ในรูปแบบ blob:
git hash-object -w hello.txtตรวจสอบประเภทและเนื้อหาของ Object:
git cat-file -t [YOUR_HASH]git cat-file -p [YOUR_HASH]สร้าง commit และดู tree:
git add hello.txtgit commit -m 'Initial commit'git ls-tree HEAD
เมื่อมองลึกลงไปถึงกลไกการทำงานภายใน คุณจะเห็นว่า Git เป็นมากกว่าแค่เครื่องมือควบคุมเวอร์ชัน (Version Control Tool) แต่มันคือฐานข้อมูลของ content-addressed objects ที่มีการจัดระเบียบอย่างดีเยี่ยม
Source: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc
Optional learning community: https://t.me/GyaanSetuAi
