Menu
Coddy logo textTech

Git Undo Commit: ביטול קומיט

עודכן לאחרונה

הדרך לבטל קומיט תלויה באיזה קומיט מדובר ואם הוא כבר נדחף. קומיט ישן שקבור בהיסטוריה, או כל דבר שכבר שותף, דורש git revert, שמוסיף קומיט חדש שהופך אותו בלי לשכתב שום דבר. רצף של קומיטים מקומיים אחרונים אפשר פשוט למחוק עם git reset. אם כל מה שצריך הוא לבטל את הקומיט האחרון, העמוד על git undo last commit מכסה כל גרסה של התיקון המהיר הזה.

נסו את הפקודות האלה בעורך הטרמינל אונליין: shell אמיתי בדפדפן, בלי להתקין כלום.

שתי דרכים לבטל קומיט: git reset מחזיר את הענף אחורה (עבודה מקומית), git revert מוסיף קומיט הפוך (בטוח גם אחרי push).

באיזו פקודה להשתמש

מצבפקודה
ביטול קומיט ישן אחד תוך שמירה על כל מה שאחריוgit revert <hash>
ביטול קומיט שכבר דחפתםgit revert <hash>
ביטול 3 הקומיטים המקומיים האחרונים תוך שמירת העבודהgit reset --soft HEAD~3
ביטול 3 הקומיטים המקומיים האחרונים ומחיקת העבודהgit reset --hard HEAD~3
ביטול טווח עם קומיטים הפוכים חדשיםgit revert HEAD~3..HEAD

reset מול revert

התנהגותgit resetgit revert
משכתב היסטוריהכןלא
בטוח לקומיטים שנדחפולאכן
יוצר קומיט חדשלאכן
עובד על קומיטים ישנים באמצע ההיסטוריהלאכן
יכול למחוק שינוייםכן (--hard)לא

דוגמה מלאה

ביטול קומיט ישן מסוים, גם כזה שכבר נדחף, בלי לגעת בקומיטים שבאו אחריו.

שלבפקודהתוצאה
1git log --onelineמציאת ה-hash של הקומיט הבעייתי (למשל a1b2c3d)
2git revert a1b2c3dקומיט חדש הופך אותו; הקומיטים המאוחרים לא משתנים
3git pushשיתוף התיקון: שום היסטוריה לא נכתבה מחדש

שאלות נפוצות על ביטול קומיט ב-Git

איך מבטלים קומיט ישן בלי לאבד את הקומיטים שאחריו?
השתמשו ב-git revert <hash>. revert יוצר קומיט חדש שהופך רק את הקומיט שציינתם: כל קומיט שאחריו נשאר בדיוק כפי שהיה. מצאו קודם את ה-hash עם git log --oneline. אם ה-revert מתנגש עם שינויים מאוחרים יותר, Git עוצר כדי שתוכלו לפתור את הקונפליקט ולהריץ git revert --continue.
איך מבטלים כמה קומיטים בבת אחת?
לקומיטים מקומיים בלבד, git reset --soft HEAD~3 מסיר את שלושת האחרונים ומשאיר את השינויים שלהם מוכנים (השתמשו ב---hard כדי למחוק אותם). לקומיטים שנדחפו, עשו revert לטווח במקום זאת: git revert --no-commit HEAD~3..HEAD הופך את שלושתם, ואז git commit יחיד שומר את הביטול.
איך מבטלים קומיט שכבר דחפתי?
השתמשו ב-git revert <hash> במקום ב-reset. revert יוצר קומיט חדש שמבטל את השינויים של קומיט היעד ומשאיר את ההיסטוריה שלמה. זו הדרך הבטוחה לבטל קומיטים משותפים: שכתוב היסטוריה שנדחפה עם reset מאלץ את כל השאר ליישב את העותקים שלהם.
מתי להשתמש ב-reset ומתי ב-revert?
השתמשו ב-reset כשהקומיטים שייכים רק לכם ועדיין מקומיים: הוא פשוט מחזיר את הענף אחורה, כאילו הם מעולם לא קרו. השתמשו ב-revert כשהקומיט נדחף, שותף או נמצא באמצע ההיסטוריה: הוא מבטל את השינויים עם קומיט חדש שבטוח לכולם למשוך.
אפשר לתרגל את זה אונליין?
כן. פתחו את עורך הטרמינל אונליין כדי להריץ את הפקודות האלה ב-shell אמיתי בדפדפן, בלי להתקין כלום. גם קורס ה-Git האינטראקטיבי והחינמי של Coddy מלמד ביטול שינויים צעד אחר צעד.
איור של שפות התכנות ב-Coddy

ללמוד Git עם Coddy

להתחיל