Git Undo Commit: ביטול קומיט
עודכן לאחרונה
הדרך לבטל קומיט תלויה באיזה קומיט מדובר ואם הוא כבר נדחף. קומיט ישן שקבור בהיסטוריה, או כל דבר שכבר שותף, דורש git revert, שמוסיף קומיט חדש שהופך אותו בלי לשכתב שום דבר. רצף של קומיטים מקומיים אחרונים אפשר פשוט למחוק עם git reset. אם כל מה שצריך הוא לבטל את הקומיט האחרון, העמוד על git undo last commit מכסה כל גרסה של התיקון המהיר הזה.
נסו את הפקודות האלה בעורך הטרמינל אונליין: shell אמיתי בדפדפן, בלי להתקין כלום.
באיזו פקודה להשתמש
| מצב | פקודה |
|---|---|
| ביטול קומיט ישן אחד תוך שמירה על כל מה שאחריו | 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 reset | git revert |
|---|---|---|
| משכתב היסטוריה | כן | לא |
| בטוח לקומיטים שנדחפו | לא | כן |
| יוצר קומיט חדש | לא | כן |
| עובד על קומיטים ישנים באמצע ההיסטוריה | לא | כן |
| יכול למחוק שינויים | כן (--hard) | לא |
דוגמה מלאה
ביטול קומיט ישן מסוים, גם כזה שכבר נדחף, בלי לגעת בקומיטים שבאו אחריו.
| שלב | פקודה | תוצאה |
|---|---|---|
| 1 | git log --oneline | מציאת ה-hash של הקומיט הבעייתי (למשל a1b2c3d) |
| 2 | git revert a1b2c3d | קומיט חדש הופך אותו; הקומיטים המאוחרים לא משתנים |
| 3 | git 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 מלמד ביטול שינויים צעד אחר צעד.