.git Directory คืออะไร? สำรวจโครงสร้างภายใน Repository

.git Directory คือโฟลเดอร์ที่เก็บข้อมูล Metadata ทั้งหมดของ Git Repository ซึ่งสร้างขึ้นเมื่อคุณเริ่มต้น Git ครั้งแรก Directory นี้มีความสำคัญมากเพราะเก็บประวัติการเปลี่ยนแปลง (commit history) การตั้งค่า (configuration) และข้อมูลอื่น ๆ ที่เกี่ยวข้องกับเวอร์ชั่นควบคุมของโปรเจกต์ของคุณ ในบทความนี้เราจะสำรวจโครงสร้างภายในของ .git Directory โดยรายละเอียด

HEAD File คืออะไร?

HEAD File เป็นไฟล์ที่ชี้ไปยัง Branch ปัจจุบันที่คุณกำลังทำงานอยู่ โดยปกติจะชี้ไปยัง main หรือ develop branch เมื่อคุณเปลี่ยน branch HEAD จะอัปเดตให้ชี้ไปยัง branch ใหม่

# ตรวจสอบ HEAD pointer
$ cat .git/HEAD
ref: refs/heads/main

# กรณี Detached HEAD state
$ cat .git/HEAD  
3f4d5c6b7a8e9f0d1c2b3a4f5e6d7c8b9a0f1e2d

Config File สำหรับตั้งค่า Repository

ไฟล์ .git/config เก็บการตั้งค่าที่เฉพาะเจาะจงสำหรับ Repository นี้ โดยครอบคลุมข้อมูลเช่น Remote URL ชื่อผู้ใช้ อีเมล และการตั้งค่า Branch ต่าง ๆ

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = https://github.com/user/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "main"]
    remote = origin
    merge = refs/heads/main

Objects Directory – หลักสำคัญของ Git Storage

Directory .git/objects เป็นที่เก็บข้อมูลหลักของ Git โดยใช้ SHA-1 Hash เพื่อระบุแต่ละอ็อบเจกต์ Objects ในที่นี้ประกอบด้วย Blobs (เนื้อหาของไฟล์) Trees (โครงสร้างโฟลเดอร์) Commits (ข้อมูล Commit) และ Annotated Tags

# โครงสร้าง Objects Directory
.git/objects/
  |- 3f/              (สองตัวแรกของ SHA-1 Hash)
  |-   d5c6b7a8...   (ส่วนที่เหลือของ Hash)
  |- info/
  |- pack/

# ประเภท Objects ที่ Git เก็บ
# Blobs: เนื้อหาของไฟล์ทั้งหมด
# Trees: รายการไฟล์และ Subdirectories
# Commits: ข้อมูล Metadata ของแต่ละ Commit
# Annotated Tags: ข้อมูล Tag Objects

Refs Directory – การอ้างอิง Branch และ Tag

Directory .git/refs เก็บการอ้างอิง (References) ไปยัง Commits ต่าง ๆ ซึ่งแบ่งออกเป็นสามส่วนคือ heads (สำหรับ Local Branches) tags (สำหรับ Tags) และ remotes (สำหรับ Remote Branches)

# โครงสร้าง Refs Directory
.git/refs/
  |- heads/
  |   |- main               (ชี้ไปยัง Commit ID)
  |   |- feature-x          (ชี้ไปยัง Commit ID)
  |- tags/
  |   |- v1.0.0
  |   |- release
  |- remotes/
      |- origin/main
      |- origin/develop

Hooks Directory – ทำให้ Git Automation อัตโนมัติ

Hooks เป็นสคริปต์ที่ทำงานอัตโนมัติเมื่อ Git Events บางอย่างเกิดขึ้น เช่น ก่อน Commit หรือหลัง Push สิ่งนี้เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการตรวจสอบรหัส (code validation) และอัตโนมัติเวิร์กโฟลว์

# ประเภท Hooks ที่พบบ่อย
.git/hooks/
  |- pre-commit      # ทำงานก่อน Commit
  |- post-commit     # ทำงานหลัง Commit
  |- pre-push        # ทำงานก่อน Push
  |- post-merge      # ทำงานหลัง Merge
  |- pre-receive     # Server-side hook
  |- update          # Server-side hook
  |- post-receive    # Server-side hook

# ตัวอย่าง: สร้าง Pre-commit Hook สำหรับ Testing
#!/bin/bash
echo "Running tests before commit..."
npm test

ไฟล์และโฟลเดอร์ที่สำคัญอื่น ๆ ใน .git

  • .git/COMMIT_EDITMSG: เก็บข้อความจาก Commit ล่าสุดที่คุณเขียน ซึ่งมีประโยชน์สำหรับการแก้ไข Commit ล่าสุด
  • .git/FETCH_HEAD: ติดตามข้อมูลจาก Remote Repository ล่าสุดที่คุณ Fetch ซึ่งมีประโยชน์เมื่อต้องการเล่นซ้ำการทำงาน Merge
  • .git/ORIG_HEAD: เก็บ Snapshot ของ HEAD ก่อนการทำ Reset หรือ Rebase ใช้สำหรับการกู้คืนข้อมูล
  • .git/index: Staging Area ที่เก็บไฟล์ที่เตรียมไว้สำหรับ Commit ถัดไป
  • .git/packed-refs: เก็บ Compressed References สำหรับการเพิ่มประสิทธิภาพของ Repository

ทำไมต้องเข้าใจ .git Directory?

การเข้าใจโครงสร้างภายในของ .git Directory จะช่วยให้คุณ:

  • แก้ไขปัญหา Git ที่ซับซ้อนได้อย่างมีประสิทธิภาพ
  • กำหนดค่า Hooks เพื่อเพิ่มประสิทธิภาพการทำงาน
  • ทำความเข้าใจว่า Git เก็บและจัดการข้อมูลอย่างไร
  • ใช้ Advanced Git Commands ได้อย่างมั่นใจ
  • ป้องกันและกู้คืนข้อมูล Repository ได้

สรุป: .git Directory เป็นหัวใจของ Git System ที่เก็บข้อมูลสำคัญทั้งหมดของ Repository การเข้าใจโครงสร้างนี้จะช่วยให้คุณใช้ Git ได้อย่างมีประสิทธิภาพและแก้ไขปัญหาต่าง ๆ ได้อย่างสมาร์ท