รูปปกบทความ

1. 🎯 ตอนที่ 2: สถาปัตยกรรม 3 โซนของ Git และวงจรชีวิตของไฟล์

2. 📖 เปิดฉาก (The Hook)

จิบกาแฟยามเช้าทีไร พี่มักจะนึกถึงคำถามคลาสสิกของน้องๆ Dev ที่เพิ่งเริ่มใช้ Git เสมอ… “พี่ครับ ผมแก้โค้ดไปร้อยกว่าไฟล์ แต่ดันอยากจะ Commit แยกเรื่องกัน ผมต้องทำยังไง?” หรือบางทีก็โอดครวญว่า “ผมพิมพ์คำสั่ง git commit ไปแล้ว แต่มันบอกว่าไม่มีอะไรให้ Commit ทั้งที่ผมเพิ่งแก้โค้ดไปแท้ๆ!”

สาเหตุของความสับสนเหล่านี้เกิดจากการที่เรายังไม่เข้าใจ “กลไก 3 โซน” ของ Git ครับ ซึ่งต่างจากระบบ Version Control ยุคเก่าตรงที่เวลาเรากด Save ปุ๊บ โค้ดไม่ได้วิ่งพุ่งตรงเข้า Repository ทันที แต่ Git มีการแบ่งพื้นที่การทำงานออกเป็น 3 โซนหลักๆ เพื่อให้เราควบคุมทุกอย่างได้ดั่งใจนึก วันนี้เรามาสวมวิญญาณสถาปนิก รื้อดูโครงสร้างบ้านของ Git กันครับ!

3. 🧠 แก่นวิชา (Core Concepts)

หัวใจสำคัญที่จะทำให้คุณใช้งาน Git ได้อย่างลื่นไหล คือการจำให้ขึ้นใจว่า Git แบ่งพื้นที่การทำงานของโปรเจกต์ออกเป็น 3 ส่วนหลัก (3 Trees):

  1. Working Directory (โต๊ะทำงาน): พื้นที่ที่คุณกำลังนั่งเขียนโค้ดอยู่ ไฟล์ต่างๆ ที่เปิดดูได้ แก้ไขได้ จะอยู่ในโซนนี้ เปรียบเสมือน “โต๊ะทำงาน” หรือ “Sandbox” ที่เราจะทดลองทำอะไรกับไฟล์ก็ได้
  2. Staging Area / Index (กล่องเตรียมแพ็กของ): โซนนี้คือพื้นที่พักคอย (Draft Space) ที่คั่นกลางระหว่าง Working Directory และ Repository เป็นที่ที่เราเอาไฟล์ที่แก้เสร็จแล้วมากองรวมกันเพื่อรอการบันทึก เปรียบเสมือน “กล่องลัง” ที่เราคัดเลือกของใส่ลงไปเตรียมแพ็ก หรือถ้าให้เห็นภาพชัดๆ มันเหมือน “การจัดแถวเด็กนักเรียนเพื่อเตรียมถ่ายรูปรูปหมู่”
  3. Local Repository / Git Directory (อัลบั้มรูป/โกดังเก็บของ): นี่คือโฟลเดอร์ซ่อนชื่อ .git ที่เป็นหัวใจของ Git เป็นที่เก็บฐานข้อมูลและประวัติการเปลี่ยนแปลงทั้งหมด (Commit History) ของโปรเจกต์ เปรียบเสมือน “อัลบั้มรูป” ที่เมื่อเราถ่ายรูป (Commit) เสร็จแล้ว รูปนั้นจะถูกเก็บไว้อย่างปลอดภัย ถาวร และเรียกดูย้อนหลังได้เสมอ

สถานะของไฟล์ในระบบ Git (File States) เมื่อโค้ดของเราเดินทางผ่านโซนทั้ง 3 ไฟล์จะมีสถานะที่เปลี่ยนไปตามช่วงเวลา แบ่งหลักๆ เป็น 2 กลุ่มคือ Untracked (ไม่ถูกติดตาม) และ Tracked (ติดตามแล้ว):

  • Untracked: ไฟล์เกิดใหม่ใน Working Directory ที่ Git ยังไม่รู้จัก (ยังไม่เคยถูก add เข้าสู่ระบบ)
  • Modified: ไฟล์ที่ Git รู้จักแล้ว แต่เรา “แก้ไข” มันใน Working Directory และยังไม่ได้เอาลงกล่อง (ยังไม่ Staged)
  • Staged: ไฟล์ที่เราประทับตราว่า “เตรียมตัวนะ จะบันทึกแล้ว” โดยถูกดึงเข้าสู่ Staging Area เรียบร้อยแล้ว
  • Committed: ไฟล์ที่ถูกบันทึกลง Local Repository อย่างปลอดภัยกลายเป็นประวัติศาสตร์ (Snapshot) เรียบร้อย
สถาปัตยกรรม 3 โซนของ Git

4. 💻 ร่ายมนต์คำสั่ง (Show me the Commands)

การย้ายไฟล์ข้ามโซนไปมา เราจะใช้คำสั่งเหล่านี้เป็นประจำครับ ลองดูตัวอย่างกัน:

# 1. เช็คสถานะปัจจุบันของโต๊ะทำงานและกล่องแพ็กของ
git status

# 2. แก้ไขไฟล์เสร็จแล้ว ต้องการหยิบไฟล์ "index.html" ใส่ลงกล่อง (จาก Working Directory -> Staging Area)
git add index.html

# 3. ถ้าอยากกวาดไฟล์ทั้งหมดบนโต๊ะที่แก้แล้ว ใส่ลงกล่องรวดเดียว (ระวังใช้นะเอ้อ!)
git add .

# 4. ถ่ายรูปรูปหมู่! แพ็กของในกล่องทั้งหมดลงโกดัง (จาก Staging Area -> Local Repository)
git commit -m "feat: เพิ่มหน้า index สำหรับเว็บไซต์"

# 5. (คำสั่งพิเศษ) อยากแอบดูว่าในกล่อง Staging Area มีของอะไรอยู่บ้างแบบเจาะลึก 
git ls-files -s

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)

หลายคนอาจจะสงสัยว่า “ทำไม Git ต้องมี Staging Area ด้วย? ทำไมไม่ Commit จาก Working Directory เข้า Repository ไปเลยให้จบๆ ยุ่งยากทำไม?”

ความลับคือ Staging Area ถูกออกแบบมาเพื่อให้เราสามารถสร้าง “Atomic Commit” หรือการบันทึกงานที่มุ่งเน้นไปที่ “การแก้ปัญหาทีละเรื่อง” ได้อย่างแม่นยำครับ สมมติว่าบนโต๊ะทำงาน คุณเผลอแก้โค้ดไป 5 ไฟล์: 2 ไฟล์เป็นเรื่องแก้บั๊ก, อีก 3 ไฟล์เป็นเรื่องเพิ่มฟีเจอร์ใหม่

ถ้าไม่มี Staging Area คุณจะถูกบังคับให้บันทึก 5 ไฟล์นี้รวมกันเป็นก้อนเดียว ประวัติการทำงานจะเละเทะมาก แต่ด้วย Staging Area (หรืออีกชื่อคือ Index) คุณสามารถค่อยๆ ใช้คำสั่ง git add เลือกหยิบแค่ 2 ไฟล์แรกใส่กล่อง แล้วค่อย git commit -m "fix: แก้บั๊ก" จากนั้นค่อยกลับมา git add 3 ไฟล์ที่เหลือ แล้วทำอีก Commit แยกกันได้

แถมในอนาคต หากคุณเจอเหตุการณ์โค้ดตีกัน (Merge Conflict) Staging Area นี่แหละครับที่จะเป็นพื้นที่หลักในการเก็บไฟล์ที่รอดชีวิตจากการ Merge และรอให้คุณจัดการไฟล์ที่ตีกันให้เสร็จก่อน จึงจะอนุญาตให้ Commit ต่อได้

6. 🏁 บทสรุป (To be continued…)

จะเห็นได้ว่าการทำงานของ Git ไม่ใช่แค่การกดเซฟไฟล์ส่งๆ ไป แต่เป็นศิลปะของการคัดเลือกผลงาน (Staging) และการถ่ายภาพเก็บประวัติ (Committing) เมื่อเราเข้าใจสถาปัตยกรรม 3 โซนนี้แล้ว การเขียนคำสั่ง Git ของเราจะเฉียบคมขึ้นอย่างแน่นอนครับ

ในตอนต่อไป หลังจากที่เราแพ็กของลง Local Repository เป็นแล้ว พี่จะพาไปดูวิธีการเชื่อมต่อโลกภายนอก เอาโค้ดของเราขึ้นไปผงาดบนเซิร์ฟเวอร์ด้วย Git Remotes เตรียมตัวให้พร้อม แล้วพบกันครับ!


ต้องการที่ปรึกษาด้านการวางระบบ DevOps และ Version Control ให้กับทีมหรือองค์กรของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและวางระบบ CI/CD แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p