ตอนที่ 8: ไฟล์ลับ .gitignore – กฎของการเมินเฉย

1. 🎯 ตอนที่ 8: ไฟล์ลับ .gitignore – กฎของการเมินเฉย
2. 📖 เปิดฉาก (The Hook)
จิบกาแฟยามดึกทีไร พี่มักจะนึกถึงฝันร้ายของน้องๆ จูเนียร์ที่เพิ่งเริ่มใช้ Git เสมอครับ… เหตุการณ์แรกคือ น้องพิมพ์ git add . แล้วดันกวาดเอาโฟลเดอร์สยองขวัญอย่าง node_modules ที่มีไฟล์นับแสนบรรทัดขึ้นไปเก็บบน Repository ด้วย ผลคือโปรเจกต์บวมฉึ่งและ Push โค้ดช้าเป็นเต่าคลาน!
แต่ที่สยองกว่านั้นคือ เหตุการณ์ที่สอง… น้องเผลอ Commit ไฟล์ .env หรือไฟล์คอนฟิกที่เก็บ “รหัสผ่าน Database” (Credentials) หรือ API Key พุ่งหลาวขึ้นไปบน GitHub แบบสาธารณะ ตื่นเช้ามาอีกทีเซิร์ฟเวอร์โดนแฮกเกอร์ขุดเหมืองคริปโตไปเรียบร้อย!
เพื่อป้องกันไม่ให้ประวัติศาสตร์ซ้ำรอย โลกของ Git จึงได้มอบการ์ดป้องกันภัยที่ชื่อว่า .gitignore มาให้เราครับ วันนี้เราจะมาเรียนรู้วิธีตั้งกฎ “การเมินเฉย” เพื่อกรองเอาไฟล์ขยะและไฟล์อันตรายออกจากการติดตามของ Git กัน!
3. 🧠 แก่นวิชา (Core Concepts)
ในหลักการของ Version Control นั้น “เราไม่จำเป็นต้อง (และไม่ควร) เก็บทุกไฟล์ลงในระบบ” ครับ ไฟล์ที่เราควรจะ Commit คือไฟล์ Source Code หรืองานที่เราเขียนขึ้นมาเองจริงๆ เท่านั้น
ไฟล์ที่เราควรสั่งให้ Git เมินเฉย (Ignore) มักจะจัดอยู่ในกลุ่มเหล่านี้:
- ไฟล์ระบบ (System files): เช่น
.DS_Storeของฝั่ง Mac หรือThumbs.dbของฝั่ง Windows - ไฟล์ความลับ (App configuration / Credentials): ไฟล์ที่เก็บรหัสผ่านหรือ Environment variables เช่น
.env,app.config - ไฟล์ที่เกิดจากการ Build (Build artifacts): ไฟล์โค้ดที่ถูกคอมไพล์แล้ว เช่น
*.classใน Java,*.pycใน Python, หรือไฟล์.exe - ไลบรารีที่ติดตั้งมา (Installed dependencies): โฟลเดอร์มหาภัยอย่าง
node_modules/หรือโฟลเดอร์vendor/ที่เราสามารถโหลดใหม่เมื่อไหร่ก็ได้ผ่าน Package Manager - ไฟล์ Log และไฟล์ชั่วคราว: เช่น
*.log,*.tmp, ไฟล์ Backup ของ Text Editor เช่น*~หรืิอ*.bak
พระเอกของเราคือไฟล์ที่ชื่อว่า .gitignore (มีจุดนำหน้าด้วยนะ) มันคือไฟล์ Text ธรรมดาที่เราเอาไปวางไว้ในโฟลเดอร์โปรเจกต์ เพื่อบอก Git ว่า “ถ้าเจอไฟล์หรือโฟลเดอร์ที่มีชื่อตรงกับในลิสต์นี้ ห้ามเอาเข้า Staging Area เด็ดขาด!”

4. 💻 ร่ายมนต์คำสั่ง (Show me the Commands)
Syntax หรือไวยากรณ์ในการเขียนไฟล์ .gitignore นั้นง่ายมากครับ มันใช้หลักการ Pattern Matching แบบเดียวกับระบบ Shell (Globbing) เรามาดูเครื่องหมายที่สำคัญกัน:
#(คอมเมนต์): บรรทัดที่ขึ้นต้นด้วยเครื่องหมายชาร์ป จะถูก Git ละเว้น เราใช้สำหรับเขียนคำอธิบาย*(Wildcard): เครื่องหมายดอกจัน ใช้แทนตัวอักษรใดๆ ก็ได้ เช่น*.logหมายถึง “มองข้ามไฟล์อะไรก็ตามที่ลงท้ายด้วย .log”/(Directory): เครื่องหมายทับ ถ้าต่อท้ายชื่อ (เช่นnode_modules/) แปลว่า “มองข้ามโฟลเดอร์นี้ทั้งโฟลเดอร์”!(Negation): เครื่องหมายตกใจ ใช้สำหรับ “ยกเว้นการมองข้าม” (บังคับให้ติดตาม) เช่น เราบอกว่าให้มองข้าม*.logทั้งหมด แต่ถ้าเขียนบรรทัดถัดมาว่า!important.logไฟล์นี้จะถูกติดตาม!
ตัวอย่างโครงสร้างไฟล์ .gitignore สำหรับโปรเจกต์จริง (Real-world Example):
# 1. มองข้ามไฟล์ Log ทั้งหมด
*.log
# 2. มองข้ามโฟลเดอร์ dependencies ของโปรเจกต์ Node.js
node_modules/
# 3. มองข้ามไฟล์ความลับ หรือคอนฟิกส่วนตัว (ห้ามหลุดขึ้น Repo เด็ดขาด!)
.env
config.local.json
# 4. มองข้ามไฟล์ขยะของระบบปฏิบัติการ
.DS_Store
Thumbs.db
# 5. มองข้ามไฟล์ที่คอมไพล์แล้ว (สมมติว่าเป็นโปรเจกต์ Java)
*.class
/build/
# 6. ทริคพิเศษ: มองข้ามไฟล์ .txt ทั้งหมด แต่ขอยกเว้นไฟล์ readme.txt เอาไว้!
*.txt
!readme.txt5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
ในการใช้งานจริง มีหลุมพรางที่โปรแกรมเมอร์มักจะตกลงไปบ่อยๆ พี่ขอสรุปเคล็ดลับจากคัมภีร์มาให้ครับ:
- 💥 ใส่ .gitignore แล้ว แต่ Git ก็ยัง Track ไฟล์อยู่ดี!:
นี่คือปัญหาคลาสสิกครับ! กฎเหล็กคือ
.gitignoreจะมีผลกับไฟล์ที่เป็น Untracked (ยังไม่เคยถูก Git รู้จัก) เท่านั้น หากน้องเผลอgit addและgit commitไฟล์ความลับไปแล้ว การมาเขียนเพิ่มใน.gitignoreทีหลังจะ ไม่มีผล ครับ Git จะยังคงตามสโตกเกอร์ไฟล์นั้นต่อไป วิธีแก้: เราต้องสั่งให้ Git ลืมไฟล์นั้นไปก่อน (ลบออกจาก Index แต่ไม่ลบไฟล์จริงออกจากเครื่อง) ด้วยคำสั่งนี้:git rm --cached <ชื่อไฟล์>หรือgit rm -r --cached <ชื่อโฟลเดอร์>แล้วค่อย Commit ใหม่ครับ - 🤝 .gitignore ต้องถูก Commit เสมอ:
ไฟล์
.gitignoreถือเป็นกติกาของหมู่บ้านครับ เรา “ต้อง” ทำการgit add .gitignoreและ Commit มันขึ้นไปยัง Repository ด้วย เพื่อให้เพื่อนร่วมทีมทุกคนที่ Clone โปรเจกต์ไป มีกฎการเมินเฉยไฟล์แบบเดียวกัน - 🌍 Global .gitignore (กฎเมินเฉยส่วนตัว):
บางทีเราอาจจะมีไฟล์ขยะที่เกิดจาก Text Editor ส่วนตัวของเราคนเดียว (เช่น ขยะจาก VS Code หรือ IntelliJ) ซึ่งเพื่อนคนอื่นไม่ได้ใช้ ถ้าเราเอาไปเขียนใส่
.gitignoreของโปรเจกต์ก็อาจจะไปรกตาเพื่อน เราสามารถสร้าง.gitignore_globalไว้ที่ Home Directory ของคอมพิวเตอร์เรา แล้วตั้งค่าระดับ Global ได้ครับ มันจะมองข้ามไฟล์เหล่านี้ในทุกๆ โปรเจกต์ที่เราทำเลย!
6. 🏁 บทสรุป (To be continued…)
การตั้งค่า .gitignore ตั้งแต่วันแรกที่สร้างโปรเจกต์ ถือเป็น “Best Practice” ระดับทองคำที่จะช่วยให้ประวัติการ Commit ของเราสะอาด ปราศจากไฟล์ขยะ และที่สำคัญที่สุดคือป้องกันความลับขององค์กรรั่วไหลครับ
เมื่อโปรเจกต์ของเราสะอาดและปลอดภัยแล้ว ในตอนต่อไป พี่จะพาไปรู้จักกับศิลปะการแตกกิ่งก้านสาขา หรือ Branching ซึ่งเป็นหัวใจสำคัญที่ทำให้ทีมงานหลายสิบคนสามารถเขียนโค้ดพร้อมกันได้โดยไม่ตีกัน รอติดตามความมันส์กันได้เลยครับ!
---
**ต้องการที่ปรึกษาด้านการวางระบบ DevOps และ Version Control ให้กับทีมหรือองค์กรของคุณ?**
ทีมงาน WP Solution พร้อมให้บริการออกแบบและวางระบบ CI/CD แบบครบวงจร
ดูรายละเอียดบริการของเราได้ที่: [www.wpsolution2017.com](https://www.wpsolution2017.com)
หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p