לבטל דברים בגיט מקומי

ביטול דברים בגיט עוד לפני שעשינו push - איך מבטלים commit, add וחברים נוספים.
Git logo

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

לשחזר קובץ למצבו המקורי

אם למשל עשינו שינוי מקומי כלשהו ואנחנו רוצים להחזיר את המצב לקדמותו – כלומר למצבו לאחר הקומיט האחרון, זה קל ופשוט – git checkout ושם הקובץ או נקודה לכל הקבצים.

git checkout .
$ git status On branch master Changes not staged for commit:   (use "git add <file>..." to update what will be committed)   (use "git checkout -- <file>..." to discard changes in working directory)          modified:   index.html  no changes added to commit (use "git add" and/or "git commit -a")  barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git checkout .  barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git status On branch master nothing to commit, working directory clean
Git checkout שמשחזר את כל הקבצים למצבם המקורי לאחר הקומיט האחרון.

לתקן את ה-commit

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

git commit --amend

מה יקרה? אני אוכל לתקן את הודעת הקומיט והקבצים/השינויים שרציתי לעשות יתווספו לקומיט האחרון כאילו הם היו חלק ממנו.

ביצעתי git add אבל במקום git commit השתמשתי ב git commit --amend. כל השינויים התווספו לקומיט האחרון ולא נחשבים כקומיט חדש.
ביצעתי git add אבל במקום git commit השתמשתי ב git commit –amend. כל השינויים התווספו לקומיט האחרון ולא נחשבים כקומיט חדש.

להוריד קובץ מה-staging

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

git reset FILENAME
$ git status On branch master Untracked files:   (use "git add <file>..." to include in what will be committed)          another_file.html  nothing added to commit but untracked files present (use "git add" to track)  barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git add another_file.html  barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git status On branch master Changes to be committed:   (use "git reset HEAD <file>..." to unstage)          new file:   another_file.html   barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git reset another_file.html  barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git status On branch master Untracked files:   (use "git add <file>..." to include in what will be committed)          another_file.html  nothing added to commit but untracked files present (use "git add" to track)  barzik@BARZIK2 MINGW64 ~/test/examplegit (master)
ביצעתי git add ועכשיו התחרטתי, מאוד פשוט לתקן – פשוט git reset ושם הקובץ. הקובץ יצא ממצב ה-staging ואני יכול להחליט מה לעשות איתו.

לבטל commit שכבר נעשה

אם עשינו קומיט אבל התחרטנו ואנחנו רוצים לעשות לו revert, גם את זה אפשר לעשות עם git reset באמצעות הפקודה הבאה

git reset --soft HEAD~

הפקודה הזו תיקח את ה-commit (לפני שנעשה לו push כמובן) ואת כל השינויים שלו ותחזיר אותם לשלב ה-stage (כלומר השלב של רגע לפני ה-commit) מהנקודה הזו אנחנו יכולים להחליט מה לעשות איתם.

$ git status On branch master nothing to commit, working directory clean  barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git reset --soft HEAD~  barzik@BARZIK2 MINGW64 ~/test/examplegit (master) $ git status On branch master Changes to be committed:   (use "git reset HEAD <file>..." to unstage)          new file:   another.html
אני עושה git status כדי לראות שכל הקבצים בתוך ה-commit. אם אני רוצה לבטל את הקומיט, כל מה שאני צריך זה להריץ את הפקודה ולראות איך הקומיט מתבטל וכל השינויים חוזרים ל-stage.

להשמיד את הקומיט האחרון

זהירות! זה משהו שימחוק דברים. אם אתה רוצה להשמיד, לאבד ולשרוף את הקומיט האחרון, יש להריץ את הפקודה הזו:

git reset --hard HEAD~

במאמר הבא אנחנו נדבר על תיקונים שאפשר לעשות לאחר שעשינו push.

פוסטים נוספים שכדאי לקרוא

רספברי פיי

התקנת OpenCanary על רספברי פיי

מה זה OpenCanary ואיך אפשר להתקין אותה על רספברי פיי ולשדרג את אבטחת הרשת הביתית או המשרדית.

ספריות ומודולים

מציאת PII באמצעות למידת מכונה

כך תגנו על משתמשים שלכם שמעלים מידע אישי רגיש כמו תעודות זהות באמצעות שירות אמאזוני.

גלילה לראש העמוד