זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/git/lessons/committed-wrong-stuff
זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/git/lessons/committed-wrong-stuff
שלום
עשיתי כבר סדרת קומיטים. הבחנתי שבכולם כלל ספריה של resources המכילה קבצים גדולים שמנפחים ומכבידים על המאגר שלי.
איך אני מסיר אותם?
להבא, איך אני מסיר תיקיות שלמות ב.gitignore?
הי דוד,
מרגע שהכנסת משהו למאגר הוא נשאר שם לעד, לכן הקומיטים שעשית עם הספריה ימשיכו להופיע במאגר גם אם תמחק את הספריה מקומיטים חדשים שתעשה. אפשר להשתמש ב git filter-branch כדי לרוץ ולמחוק תיקיה מכל הקומיטים הישנים וכאן יש דוגמא לזה:
הקוד הרלוונטי:
git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
echo node_modules/ >> .gitignore
git add .gitignore
git commit -m 'Removing node_modules from git history'
git gc
git push origin master --force
לגבי גיט איגנור יש הסבר מפורט בשיעור עליו כאן:
https://www.tocode.co.il/bundles/git/lessons/gitignore
היי
במידה ועשינו קומיט לא נכון, לא כדאי למחוק אותו (בנוסף לRESET) בעזרת git rebase -i?
כלומר, למה להשאיר אותו בקוד במידה והוא לא רלוונטי לנו?
הי,
גיט ריבייס לא מוחק קומיט. יש פה הקלטה של וובינר שהעברתי על ריבייס ממליץ לצפות בה:
https://www.tocode.co.il/past_workshops/69
בגדול הקומיט בכל מקרה יישאר במאגר (גם אחרי ריבייס).
ההבדל תלוי באיזה קומיט רוצים למחוק:
אם את צריכה למחוק את הקומיט האחרון, אז ריסט ייתן פיתרון טוב כי הוא מזיז את ה HEAD קומיט אחד אחורה וכך הקומיט האחרון שעשית ״נעלם״ (נעלם - הכוונה לא נגיש יותר דרך HEAD).
אם את צריכה למחוק קומיט ישן יותר (נגיד 4-5 קומיטים אחורה) אז הטריק עם הריסט לא מספיק. היינו יכולים לחזור אחורה 5 קומיטים, אבל עכשיו חסרים לנו כל הקומיטים שהגיעו אחרי זה שרצינו למחוק. אצייר את זה רגע:
A <- B <- C <- D <-E
נניח שאנחנו רוצים למחוק את קומיט C, אז אין בעיה לבטל את קומיטים C, D ו E עם ריסט:
git reset --hard HEAD~3
ואז נגיע ל:
A <- B
אבל עכשיו מה קרה לקומטים D ו E? אותם אנחנו דווקא כן רוצים לקבל בעץ. הבעיה שאי אפשר להכניס את קומיט D כמו שהוא, כי בתוך קובץ הקומיט כתוב ש D יוצא מקומיט C (ואת C אנחנו רוצים להעלים). לכן צריך ליצור קומיט חדש שעושה בדיוק את השינויים ש D עשה אבל יוצא מ B. אחרי זה צריך ליצור קומיט חדש שמביא את השינויים של E אבל יוצא מה D החדש (כי את ה D הקודם גם העלמנו). בקיצור נצטרך משהו שנראה ככה:
A <- B <- D1 <- E1
ריבייס יוצר אוטומטית את D1 ו E1 מתוך D ו E הישנים. לכן אנחנו צריכים אותו כשרוצים למחוק קומיט ישן, אבל אפשר להסתדר יופי בלעדיו כשלא צריך ליצור מחדש קומיטים (כלומר כשרוצים למחוק את הקומיט האחרון)