זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/git/lessons/removing-files
זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/git/lessons/removing-files
מהו ההבדל למעשה בין הפעולות:
git rm --cached
git reset
הרי שניהם למעשה גורמים למחיקת קובץ מה Staging Area אבל לא מהתיקיה, אם הבנתי נכון.
מתי נכון להשתמש בפעולה הראשונה? (עובדת עם JS אז אשמח לדוגמא מהעולם הזה)
הי,
זה שני דברים שונים:
-
git rm --cached מוחק קובץ רק מה Staging Area בשביל שהמחיקה תיכנס בקומיט הבא. נעשה את זה למשל אם בטעות הכנסנו לריפוזיטורי קובץ או תיקיה שאנחנו צריכים על המכונה אבל לא צריכים לשתף עם כולם. לדוגמא אם הכנסתי בטעות את
node_modules
לריפוזיטורי ואני רוצה להוציא אותו משם אני לא יכול להפעילgit rm -r node_modules
כי אז הקובץ יימחק גם מהמכונה שלי. לכן אשתמש בgit rm -r --cached node_modules
ואחריוgit commit
וכך הקובץ יימחק מהקומיט הבא אבל עדיין יישאר אצלי בתיקיה. אפשר להגיד שפקודה זו ״מסמנת״ את הדבר למחיקה.
אגב במצב כזה חשוב להכניס את התיקיה או הקובץ ל.gitignore
כדי שלא תכניסי אותו לגיט שוב בפעם הבאה בטעות. -
git reset לעומתה מבטלת הכנסה של משהו ל Staging Area. היא תעזור אם עשיתי git add ל
node_modules
אבל עדיין לא עשיתי קומיט.
תודה על התגובה המפורטת, חושבת שעכשיו הבנתי.
כלומר אחרי הפעולה git rm -r --cached
לnode_modules
אפשר יהיה לעשות git add .
(להכל) והקובץ לא יכלל בstaging area?
ולמעשה .gitignore
אחראי מאחורי הקלעים לבצע את הפעולה הזו באופן תמידי עבורינו?
לא מדויק
כתבתי הסבר יותר מקיף הבוקר בבלוג:
היי,
קראתי את הפוסט וגם ביצעתי את הפקודות שהצגת בהן, ועדיין משהו לא ברור לי:
-
לפי מה שאני רואה, הפקודה reset תמחוק קובץ מהstaging area רק בתנאי שלא עשיתי לו קומיט עדיין. כלומר אם אני עושה reset לקובץ שעבר commit בעבר, הפעולה לא תעשה כלום. זה נכון?
-
הפקודה rm מוחקת קובץ מהתקיית עבודה וגם מה-staging area. נכון? אבל אחרי שעשיתי לקובץ rm, הוא ישאר בהיסטוריית הקומיטים נכון?
תודה!
הי,
-
הייתי מנסח את זה יותר מדויק כך - הפקודה reset תמחוק קובץ מה staging area. הפקודה קומיט מעבירה את כל המידע שב staging area לתוך קופסה שנקראת קומיט. אחרי קומיט ממילא ה staging area מתרוקן (כי כל הקבצים שם נכנסו לקומיט) ולכן אין משמעות לעשות reset אחרי קומיט.
-
מדויק. כל קומיט הוא Snapshot מלא של הפרויקט, כלומר כולל את כל הקבצים שבו (אפשר לדמיין שאני מעתיק את כל תיקיית הפרויקט הצידה בשם חדש - וזה קומיט). לכן תמיד אפשר להסתכל על קומיט ישן ולראות את כל הקבצים שהיו בפרויקט באותו זמן.
הדרך היחידה להיפטר מקובץ לחלוטין מהמאגר היא ליצור את כל הקומיטים מחדש בלי הקובץ. זה פחות מסובך ממה שזה נשמע וכתבתי הוראות כאן:
https://www.tocode.co.il/blog/2018-09-git-filter-branch-1
היי ינון
למה זה לא שומר לי יותר מכמה commits בודדים ברגע שאני שומר 4 5 זה מוחק כל פעם את הישן ביותר זה נראה כאילו זה נמחק כי כשאני כותב git log $ זה מראה רק את האחרונים ששמרתי
מה הכוונה מוחק את הישנים? מה בדיוק הפקודה שאתה כותב כדי לראות את הלוג? יכול להדביק פה צילום מסך?
כשאני כותב git log זה מציג לי רק את ה5 הראשונים אבל אם אחרי זה אני לוחץ Enter ארוך זה מציג לי את כל הCommits שיצרתי , רק לא הבנתי למה בסוף במקום הסימן של ה$ כתוב לי END
זה בגלל ה PAGER. אם אתה ביוניקס אתה יכול להפעיל:
PAGER= git log
והוא ידפיס את כולם.