Git Reset
עודכן לאחרונה
git reset מעביר את הענף הנוכחי לקומיט אחר, ובהתאם למצב גם מעדכן את אזור ההכנה (index) ואת עץ העבודה כך שיתאימו. שלושת המצבים שונים רק בהיקף העדכון: --soft מזיז את הענף ועוצר, --mixed (ברירת המחדל) גם מאפס את אזור ההכנה, ו---hard גם דורס את קובצי העבודה שלכם.
מכיוון ש---hard מוחק עבודה שלא נשמרה בקומיט, דעו איזה מצב אתם רוצים לפני שאתם מריצים אותו. בקומיטים שכבר דחפתם, עדיף להשתמש ב-git revert. נסו את הפקודות בבטחה בעורך הטרמינל אונליין: shell אמיתי בדפדפן.
שלושת המצבים
| מצב | מזיז את הענף | מאפס את אזור ההכנה | מאפס את עץ העבודה |
|---|---|---|---|
--soft | כן | לא | לא |
--mixed (ברירת מחדל) | כן | כן | לא |
--hard | כן | כן | כן |
תחביר
| פקודה | מה היא עושה |
|---|---|
git reset --soft HEAD~1 | ביטול הקומיט האחרון, השינויים נשארים מוכנים |
git reset HEAD~1 | ביטול הקומיט האחרון, השינויים נשארים לא מוכנים |
git reset --hard HEAD~1 | ביטול הקומיט האחרון ומחיקת השינויים |
git reset <file> | הוצאת קובץ מאזור ההכנה (השינויים נשמרים) |
git reset --hard origin/main | כפיית הענף המקומי להתאים לענף המרוחק |
מקרים נפוצים
| מטרה | פקודה |
|---|---|
| הוצאת הכל מאזור ההכנה | git reset |
| הוצאת קובץ אחד מאזור ההכנה | git reset README.md |
| חזרה 3 קומיטים אחורה תוך שמירת העבודה | git reset --soft HEAD~3 |
| זריקת כל השינויים המקומיים מאז קומיט מסוים | git reset --hard <hash> |
שאלות נפוצות על git reset
מה ההבדל בין --soft, --mixed לבין --hard?
שלושתם מזיזים את מצביע הענף לקומיט היעד; ההבדל הוא במה עוד הם נוגעים.
--soft לא משנה שום דבר אחר, כך שהשינויים נשארים מוכנים. --mixed (ברירת המחדל) גם מנקה את אזור ההכנה, כך שהשינויים הופכים ללא מוכנים אבל נשארים בקבצים. --hard גם דורס את עץ העבודה כך שיתאים לקומיט היעד, ומוחק שינויים שלא נשמרו בקומיט.איך מוציאים קובץ מאזור ההכנה עם git reset?
הריצו
git reset <file> (למשל git reset README.md), או git reset בלי נתיב כדי להוציא הכל. זה מסיר את הקובץ מאזור ההכנה אבל משאיר את העריכות בעץ העבודה. בגרסאות Git חדשות אפשר גם להשתמש ב-git restore --staged <file>, שעושה את אותו הדבר באופן מפורש יותר.האם אפשר לבטל git reset --hard?
לא מתוך עץ העבודה:
--hard מוחק לצמיתות שינויים שלא נשמרו בקומיט. עם זאת, עבודה שכבר נשמרה בקומיט ואיבדתם ב-reset בדרך כלל אפשר לשחזר: הריצו git reflog כדי למצוא את ה-hash של הקומיט, ואז git reset --hard <hash> (או צרו עליו ענף). שינויים שמעולם לא הוכנו או נשמרו בקומיט אי אפשר לשחזר, אז השתמשו ב---hard בזהירות.מה ההבדל בין git reset לבין git revert?
git reset משכתב היסטוריה על ידי הזזת הענף אחורה: זה בסדר לקומיטים מקומיים, אבל מסוכן לקומיטים שכבר דחפתם. git revert משאיר את ההיסטוריה שלמה ומוסיף קומיט חדש שמבטל קומיט קודם, וזו הבחירה הבטוחה לענפים משותפים.מה git reset --soft HEAD~1 עושה?
הוא מבטל את הקומיט האחרון אבל משאיר את כל מה שהקומיט הזה שינה באזור ההכנה.
HEAD~1 פירושו קומיט אחד לפני הנוכחי, כך שהענף זז צעד אחד אחורה בזמן שאזור ההכנה ועץ העבודה נשארים כפי שהם. זו הדרך המהירה ביותר לעשות קומיט מחדש: תקנו את הקבצים או את ההודעה, ואז צרו קומיט שוב. ראו git undo last commit לאפשרויות האחרות.מה פירוש HEAD~1?
HEAD הוא הקומיט שבו אתם נמצאים, ו-~1 פירושו ההורה הראשון שלו, קומיט אחד אחורה. HEAD~2 הוא שני קומיטים אחורה, וכן הלאה. בקומיט רגיל, HEAD^ זהה ל-HEAD~1.אפשר לתרגל את זה אונליין?
כן. פתחו את עורך הטרמינל אונליין כדי להריץ
git reset ב-shell אמיתי בדפדפן, בלי להתקין כלום. גם קורס ה-Git האינטראקטיבי והחינמי של Coddy מלמד איפוס וביטול שינויים צעד אחר צעד.