ตอนที่ 7: ความลับในโฟลเดอร์ซ่อน (.git Directory)

1. 🎯 ตอนที่ 7: ความลับในโฟลเดอร์ซ่อน (.git Directory)
2. 📖 เปิดฉาก (The Hook)
สวัสดีครับน้องๆ สายโค้ดเดอร์! จิบกาแฟยามบ่ายแล้วมาล้อมวงฟังพี่เล่าเรื่องสยองขวัญในออฟฟิศกันครับ… เรื่องมันมีอยู่ว่า มีน้องจูเนียร์คนนึงกำลังเคลียร์ไฟล์ขยะในเครื่องเพื่อคืนพื้นที่ว่าง แล้วสายตาก็ดันไปสะดุดกับโฟลเดอร์สีจางๆ (Hidden Folder) ที่ชื่อว่า .git ซึ่งกินพื้นที่ไปหลายร้อยเมกะไบต์ ด้วยความไม่รู้ น้องเขาก็กด Delete ทิ้งไปอย่างเมามัน…
ผลสรุปคือโปรเจกต์ที่เขียนมาแรมเดือน ประวัติการแก้ไขหายเกลี้ยง! ย้อนเวลา (Checkout) กลับไปดูโค้ดเก่าก็ไม่ได้ โค้ดพังแทบร้องไห้! วันนี้พี่ในฐานะ Senior DevOps จะพาไปล้วงความลับของ “ห้องเครื่อง” ที่สำคัญที่สุดของระบบ Version Control กันครับว่า ทำไมไอ้โฟลเดอร์ .git ที่หน้าตาดูไม่มีอะไร ถึงเป็นหัวใจสำคัญที่เรา “ห้ามเผลอลบเด็ดขาด”
3. 🧠 แก่นวิชา (Core Concepts)
ทุกครั้งที่เราเริ่มต้นโปรเจกต์ใหม่และพิมพ์คำสั่ง git init ลงใน Terminal เบื้องหลังแล้ว Git จะทำการเสกโฟลเดอร์ซ่อนที่ชื่อว่า .git ขึ้นมาที่ระดับบนสุดของโปรเจกต์เสมอ โฟลเดอร์ธรรมดาๆ ของเราจะได้รับการสถาปนาให้เป็น Git Repository อย่างเป็นทางการก็เพราะมีโฟลเดอร์นี้นี่แหละครับ
โฟลเดอร์ .git คือที่พำนักของฐานข้อมูล Metadata และประวัติศาสตร์ทั้งหมดของโปรเจกต์ หากโฟลเดอร์นี้ถูกลบ โปรเจกต์ของคุณจะหลุดจากการติดตามของ Git ทันที ประวัติการ Commit และเวอร์ชันเก่าๆ จะหายวับไปกับตา!
เพื่อให้เห็นภาพ พี่ขอชำแหละโครงสร้างไฟล์ด้านในออกมาเป็น 3 ส่วนสำคัญ (The Big Three) ที่เปรียบเสมือนกลไกการทำงานของไทม์แมชชีนครับ:
objects/(โกดังเก็บสมบัติ): นี่คือฐานข้อมูลที่เก็บ “เนื้อหา” ทุกอย่างในโปรเจกต์ของคุณ ไม่ว่าคุณจะเพิ่มไฟล์ (Blob), สร้างโฟลเดอร์ (Tree), หรือบันทึกประวัติ (Commit) ข้อมูลทั้งหมดจะถูกบีบอัดและเก็บไว้ในนี้ โดยตั้งชื่อไฟล์เป็นรหัส SHA-1 Hash (ความยาว 40 ตัวอักษร) เปรียบเสมือนโกดังขนาดใหญ่ที่เก็บของทุกชิ้นพร้อมแปะบาร์โค้ดไว้อย่างเป็นระเบียบrefs/(ป้ายชื่อ/ป้ายบอกทาง): ย่อมาจาก References ภายในนี้จะเก็บไฟล์ตัวชี้ (Pointers) ที่บอกว่า Branch ต่างๆ หรือ Tag ต่างๆ กำลังชี้ไปที่ Commit ไหน (รหัส SHA-1 อะไร) ในโกดัง objects เปรียบเสมือน Post-it ที่เราเขียนชื่อจำง่ายๆ (เช่นmaster,dev,v1.0) แปะไว้ที่กล่องในโกดัง เพื่อให้เราไม่ต้องจำรหัสบาร์โค้ดยาวๆHEAD(เข็มทิศ “You Are Here”): ไฟล์นี้เก็บข้อมูลว่า ปัจจุบัน “คุณ” (Working Directory) กำลังยืนอยู่ที่ Branch ไหน หรือ Commit ใด เวลาเราพิมพ์คำสั่งgit commitตัว Git จะวิ่งมาดูที่ไฟล์นี้เพื่อหาว่า Commit ใหม่จะต้องเอาไปต่อท้ายที่กิ่งไหน

4. 💻 ร่ายมนต์คำสั่ง (Show me the Commands)
อยากรู้ใช่ไหมครับว่าหน้าตามันเป็นยังไง? ลองเปิด Terminal เข้าไปในโปรเจกต์ของคุณ แล้วร่ายมนต์เหล่านี้ดู (แต่อย่าเผลอไปแก้ไฟล์ด้านในล่ะ!):
# 1. แอบส่องดูไฟล์ซ่อนทั้งหมดในโปรเจกต์ จะเห็นโฟลเดอร์ .git โผล่มา
ls -la
# 2. ลองเดินเข้าไปในโฟลเดอร์ .git แล้วดูโครงสร้างต้นไม้ของมัน
cd .git
tree -L 1
# คุณจะเห็นโฟลเดอร์ objects, refs, info, hooks และไฟล์ HEAD
# 3. ลองเปิดดูข้างในไฟล์ HEAD ว่าตอนนี้เข็มทิศชี้ไปที่ไหน
cat HEAD
# ผลลัพธ์มักจะออกมาเป็น: ref: refs/heads/master (แปลว่ายืนอยู่บนกิ่ง master)
# 4. ลองเปิดดูว่าปลายทางที่เข็มทิศชี้ไป (Branch master) เก็บค่ารหัส Commit อะไรไว้
cat refs/heads/master
# ผลลัพธ์: 373f47835befd4bc24f5b0109eb96a305a15863e (รหัส Checkpoint ล่าสุด)5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
ในโลกของ Git จะมีการแบ่งกลุ่มคำสั่งออกเป็นสองประเภทครับ คือ Porcelain (เครื่องสุขภัณฑ์ที่สวยงาม ใช้งานง่าย เช่น git add, git commit, git checkout) และ Plumbing (ท่อประปาที่ซ่อนอยู่หลังกำแพง เช่น git cat-file, git hash-object)
โฟลเดอร์ .git นี้เปรียบเสมือนระบบท่อประปา (Plumbing) ครับ Best Practice ระดับ Senior คือ “ปล่อยให้ Git เป็นคนจัดการไฟล์ในโฟลเดอร์นี้ผ่านคำสั่ง Porcelain เท่านั้น” ห้ามใช้ Text Editor เข้าไปแก้ไฟล์ใน .git/refs/heads/master หรือแก้ไฟล์ใน .git/objects ด้วยมือตัวเองเด็ดขาด เว้นเสียแต่ว่าคุณกำลังเจาะลึกระบบ (Deep-dive) หรือเขียน Script ชั้นสูง การเผลอไปปรับแก้ผิดจุด อาจทำให้ Repository ของคุณเกิดอาการ Corrupt จนไทม์แมชชีนพังพินาศได้เลยทีเดียว!
6. 🏁 บทสรุป (To be continued…)
สรุปสั้นๆ ว่าโฟลเดอร์ .git คือทุกสิ่งทุกอย่างที่เป็น “ความทรงจำ” ของโปรเจกต์คุณ ตราบใดที่โฟลเดอร์นี้ยังอยู่ครบ คุณสามารถกู้คืนรหัส ลากสาขากลับมา (Branch) ย้อนประวัติ หรือทำอะไรก็ได้ทั้งนั้น แต่ถ้ามันหายไป โค้ดของคุณก็จะเป็นเพียงไฟล์ธรรมดาที่ล่องลอยอยู่ในอวกาศไร้ซึ่งอดีต
เมื่อเราเข้าใจเครื่องยนต์ของ Git แล้ว ในตอนต่อไป พี่จะพาไปดูเวทมนตร์วิชาแยกเงาพันร่าง นั่นก็คือการใช้ “Branch” แบบละเอียดว่าเมื่อเราแตกสาขาโปรเจกต์ออกมาทำงานขนานกัน (Parallel) จะมีเทคนิคการจัดการและรวมโค้ด (Merging) อย่างไรให้ทีมงานไม่ตีกัน รอติดตามความสนุกกันได้เลยครับ!
---
**ต้องการที่ปรึกษาด้านการวางระบบ DevOps และ Version Control ให้กับทีมหรือองค์กรของคุณ?**
ทีมงาน WP Solution พร้อมให้บริการออกแบบและวางระบบ CI/CD แบบครบวงจร
ดูรายละเอียดบริการของเราได้ที่: [www.wpsolution2017.com](https://www.wpsolution2017.com)
หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p