להוציא קבצים מגיט עם rm cached
מתחיל את הבוקר, נכנס לקוד פייתון, מתעצבן על וים, מפעיל פייצ'ארם, מתקן את הבאג ומכניס לגיט:
$ git add .
$ git commit -m 'fixed bug'
אופס.
בלי לשים לב הקומיט האחרון כולל גם את תיקיית .idea
שפייצ'ארם יצר. ולא יעזור עכשיו להוסיף אותה ל gitignore - כלומר יעזור קצת כי שינויים בתיקיה לא יסומנו בתור שינויים שצריך לעשות להם קומיט, אבל עדיין כל אחד שיעשה clone לפרויקט עכשיו יקבל את ה .idea
שלי.
ניסיון ראשון למחוק את התיקיה עם git rm ייכשל:
$ git rm .idea
fatal: not removing '.idea' recursively without -r
ואם אנסה להקשיב לו ולהפעיל git rm -r .idea
אני אומנם אמחק את התיקיה מגיט אבל אאבד את קבצי הגדרות הפרויקט שלי.
המפתח להתרת הקשר הוא ההבנה שבעבודה עם גיט אנחנו בעצם עובדים על מספר עותקים של הפרויקט במקביל:
יש את העותק שאנחנו רואים בתיקיית העבודה.
אפשר לחשוב על כל קומיט בתור עותק נוסף של הפרויקט.
האינדקס, או ה Staging Area, שזה הדבר שיהפוך לקומיט הבא, הוא גם כן עותק של הפרויקט.
ואם האינדקס הוא עותק שלם של הפרויקט, כל מה שאני צריך זה למחוק את הקבצים רק מהאינדקס בלי לגעת בעותק שלהם בתיקיית העבודה. וכך נולדה git rm --cached
.
אחרי שנמחק את הקבצים רק מהאינדקס ונפעיל commit
, האינדקס יהפוך להיות הקומיט הבא, שכבר לא יחזיק את תיקיית .idea
, וקובץ ה .gitignore
שהוספתי יוודא שלא אוסיף את .idea
שוב בטעות, וכל זה בלי לגעת בתיקייה עצמה שעדיין נמצאת אצלי בתיקיית העבודה:
$ git rm --cached -r .idea
rm '.idea/.gitignore'
rm '.idea/cached.iml'
rm '.idea/inspectionProfiles/profiles_settings.xml'
rm '.idea/misc.xml'
rm '.idea/modules.xml'
$ git commit -m 'removed .idea from project'
$ ls .idea
cached.iml inspectionProfiles misc.xml modules.xml vcs.xml workspace.xml