תמיד מגיע הרגע המר והנמהר שבו צריכים אשכרה לבטל דברים שעשינו בגיט. דוגמאות? לא חסר. למשל עשינו commit אבל גילינו שעשינו אותו ל-branch הלא נכון. או שעשינו אותו מוקדם יותר מדי. שהוספנו קובץ מסוים ואנחנו צריכים להעיף אותו מה-commit הספציפי וכו' וכו'. בגדול אפשר לחלק את הביטול לשניים – הביטול הקל הוא הביטול של דברים שעשינו מקומית אצלנו – כלומר כל החלק עד ה-commit. הביטול שיותר מורכב הוא ביטול של דברים שעשינו לאחר שעשינו push ל-repo מרוחק. במאמר הזה אני מדבר על ביטול של דברים שעשיתי מקומית.
לשחזר קובץ למצבו המקורי
אם למשל עשינו שינוי מקומי כלשהו ואנחנו רוצים להחזיר את המצב לקדמותו – כלומר למצבו לאחר הקומיט האחרון, זה קל ופשוט – git checkout ושם הקובץ או נקודה לכל הקבצים.
git checkout .

לתקן את ה-commit
נניח ועשיתי קומיט אבל עכשיו אני רוצה לתקן אוו, למשל להוסיף עוד קבצים או שינויים אחרים או לתקן את ההודעה. איך עושים את זה? מתקנים את הטעון תיקון, מוסיפים את השינויים (אם יש) עם git add בדיוק כאילו אנחנו מתכוננים לקומיט חדש. אבל במקום לעשות שוב git commit אנחנו נכתוב:
git commit --amend
מה יקרה? אני אוכל לתקן את הודעת הקומיט והקבצים/השינויים שרציתי לעשות יתווספו לקומיט האחרון כאילו הם היו חלק ממנו.

להוריד קובץ מה-staging
אם עשיתי git add לקובץ מסוים והוא נמצא ב-staging (כלומר בסטטוס של מוכן ל-commit), ואני מתחרט, איך אני מוציא אותו משם? באמצעות פקודת git reset
git reset FILENAME

לבטל commit שכבר נעשה
אם עשינו קומיט אבל התחרטנו ואנחנו רוצים לעשות לו revert, גם את זה אפשר לעשות עם git reset באמצעות הפקודה הבאה
git reset --soft HEAD~
הפקודה הזו תיקח את ה-commit (לפני שנעשה לו push כמובן) ואת כל השינויים שלו ותחזיר אותם לשלב ה-stage (כלומר השלב של רגע לפני ה-commit) מהנקודה הזו אנחנו יכולים להחליט מה לעשות איתם.

להשמיד את הקומיט האחרון
זהירות! זה משהו שימחוק דברים. אם אתה רוצה להשמיד, לאבד ולשרוף את הקומיט האחרון, יש להריץ את הפקודה הזו:
git reset --hard HEAD~
במאמר הבא אנחנו נדבר על תיקונים שאפשר לעשות לאחר שעשינו push.
5 תגובות
שכחת את git revert?
סנילי סנילי, אבל את זה לא שכחתי 🙂 במאמר הבא על ביטול דברים אחרי שעשינו להם push:
https://internet-israel.com/%d7%9e%d7%93%d7%a8%d7%99%d7%9b%d7%99%d7%9d/git/%d7%9c%d7%91%d7%98%d7%9c-%d7%93%d7%91%d7%a8%d7%99%d7%9d-%d7%91%d7%92%d7%99%d7%98-%d7%90%d7%97%d7%a8%d7%99-%d7%a9%d7%a2%d7%a9%d7%99%d7%a0%d7%95-push/
עדיף לעשות
git rebase -i
גם לשינוי הסבר לקומיט, גם לסדר אחרת את הקומיטים, גם למחוק לחלק ולגם לאחד
האתר הזה מעולה פותר לי את הבאגים של הגיט
אחד האתרים המועילים עלי תבל