.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 ได้อย่างมีประสิทธิภาพและแก้ไขปัญหาต่าง ๆ ได้อย่างสมาร์ท
