รู้จัก git rm --cached: เอาไฟล์ออกจาก Git tracking โดยไม่ลบในเครื่อง
`git rm --cached` ใช้สำหรับบอก Git ให้หยุดติดตามไฟล์หรือโฟลเดอร์ โดยที่ไฟล์จริงยังคงอยู่ในเครื่องของเรา เหมาะกับกรณีเผลอ track ไฟล์อย่าง `.env`, log หรือ build output และควรใช้คู่กับ `.gitignore` เสมอ

รู้จัก git rm --cached: เอาไฟล์ออกจาก Git tracking โดยไม่ลบในเครื่อง
เวลาทำงานกับ Git เรามักเจอสถานการณ์ที่เผลอเพิ่มไฟล์บางอย่างเข้าไปใน repository ทั้งที่จริงไม่ควรถูก track เช่นไฟล์ config เฉพาะเครื่อง, .env, log, build output หรือไฟล์ local อื่น ๆ ที่ไม่เกี่ยวกับซอร์สโค้ดหลัก
ในกรณีนี้ คำสั่ง git rm --cached เป็นเครื่องมือที่เหมาะมาก เพราะมันใช้สำหรับลบไฟล์ออกจากการติดตามของ Git โดยไม่ลบไฟล์จริงออกจากเครื่องเรา
git rm --cached คืออะไร
คำสั่งนี้ทำหน้าที่เอาไฟล์ออกจาก index หรือพื้นที่ที่ Git ใช้ติดตามไฟล์สำหรับการ commit ถัดไป แต่ไม่ได้ลบไฟล์ออกจาก working directory
ตัวอย่างเช่น:
git rm --cached .env
เมื่อรันคำสั่งนี้ Git จะหยุด track ไฟล์ .env แต่ไฟล์ .env จะยังคงอยู่ในเครื่องของเราเหมือนเดิม
ใช้ในสถานการณ์ไหนบ่อยที่สุด
กรณีที่พบบ่อย ได้แก่:
- เผลอ commit ไฟล์
.env - เพิ่มไฟล์ config เฉพาะเครื่องเข้า repo
- มีไฟล์ log ถูก track โดยไม่ตั้งใจ
- build output หรือไฟล์จากการ compile ถูกเพิ่มเข้า Git
- มีโฟลเดอร์ local ที่ไม่ควรถูกเก็บใน repository
คำสั่งนี้เหมาะกับสถานการณ์ที่เราต้องการเพียงแค่ หยุด track ต่อจากนี้ ไม่ใช่การลบร่องรอยไฟล์ทั้งหมดออกจากประวัติ Git
ถ้าเป็นโฟลเดอร์ต้องทำอย่างไร
ถ้าสิ่งที่ต้องการเอาออกจาก tracking เป็นโฟลเดอร์ ให้ใช้ option -r เพื่อทำงานแบบ recursive
git rm -r --cached folder/
คำสั่งนี้จะเอาทั้งโฟลเดอร์ออกจากการติดตามของ Git แต่ไฟล์ภายในโฟลเดอร์ยังอยู่ในเครื่องเช่นเดิม
ทำไมต้องใช้คู่กับ .gitignore
หลังจากใช้ git rm --cached แล้ว ควรเพิ่มชื่อไฟล์หรือโฟลเดอร์นั้นลงใน .gitignore ทันที มิฉะนั้นในอนาคตเราอาจเผลอ git add กลับเข้า repository อีกครั้ง
ตัวอย่างเช่น ถ้าเลิก track .env ก็ควรมีรายการนี้ใน .gitignore
.env
จากนั้นค่อย commit การเปลี่ยนแปลง เพื่อให้ Git รับรู้ว่าไฟล์นี้ถูกลบออกจาก repo แล้วและไม่ควรถูกติดตามต่อ
workflow ที่แนะนำ
ลำดับการทำงานที่ปลอดภัยและเข้าใจง่ายมีดังนี้:
- ใช้
git rm --cachedกับไฟล์หรือโฟลเดอร์ที่ไม่ต้องการ track - เพิ่มรายการนั้นใน
.gitignore - ใช้
git statusตรวจสอบสถานะ - commit การเปลี่ยนแปลง
ตัวอย่าง:
git rm --cached .env
echo .env >> .gitignore
git status
git add .gitignore
git commit -m "Stop tracking .env"
เมื่อดูใน git status เราจะเห็นว่า Git มองไฟล์ดังกล่าวเป็น deleted สำหรับ commit ถัดไป แต่ไฟล์จริงยังอยู่ในเครื่อง
ข้อควรระวัง: คำสั่งนี้ไม่ได้ลบไฟล์ออกจาก history เดิม
จุดสำคัญที่ต้องเข้าใจคือ git rm --cached ไม่ได้ลบไฟล์ออกจากประวัติเดิมของ Git
ถ้าไฟล์ที่เคยถูก commit ไปแล้วเป็นไฟล์ลับ เช่น API key, token หรือ secret ต่าง ๆ ปัญหายังไม่จบแค่หยุด track ไฟล์นั้น เพราะข้อมูลอาจยังอยู่ใน commit เก่า
ในกรณีนี้ควรทำเพิ่มเติม เช่น:
- rotate key หรือเปลี่ยน secret ที่รั่วไหล
- ล้างประวัติ Git หากจำเป็น
- ประเมินผลกระทบว่า secret ถูกเผยแพร่ไปที่ไหนแล้วบ้าง
ดังนั้น git rm --cached เหมาะกับโจทย์ว่า “ไม่อยากให้ Git track ไฟล์นี้ต่อไป” มากกว่าโจทย์ว่า “ต้องลบร่องรอยทุกอย่างออกจาก Git history”
กรณีไฟล์ที่ทุกคนต้องมีในเครื่อง เช่น .env
ถ้าเป็นไฟล์ประเภทที่สมาชิกในทีมทุกคนต้องมี local version ของตัวเอง เช่น .env แนวทางที่ดีคือไม่เก็บไฟล์จริงไว้ใน repo แต่เพิ่มไฟล์ตัวอย่าง เช่น .env.example แทน
วิธีนี้ช่วยให้ทีมรู้ว่าต้องกำหนดค่าตัวแปรอะไรบ้าง โดยไม่ต้องเสี่ยงนำ secret จริงขึ้น repository
ตัวอย่างไฟล์ที่ควรมีใน repo:
.env.example
และใน .gitignore ควรมี:
.env
สรุป
git rm --cached เป็นคำสั่งที่ใช้บอก Git ให้เลิกติดตามไฟล์หรือโฟลเดอร์ โดยไม่ลบไฟล์จริงออกจากเครื่องของเรา เหมาะมากสำหรับการแก้กรณีเผลอ track ไฟล์อย่าง .env, log, config เฉพาะเครื่อง หรือ build output
อย่างไรก็ตาม คำสั่งนี้ควรใช้คู่กับ .gitignore เสมอ เพื่อป้องกันการเผลอ add ไฟล์กลับเข้า repo อีกในอนาคต และต้องจำไว้ว่า ถ้าไฟล์ลับเคยถูก commit ไปแล้ว คำสั่งนี้ไม่ได้ช่วยลบข้อมูลออกจาก Git history เดิม จำเป็นต้องจัดการด้านความปลอดภัยเพิ่มเติม