Menu
Coddy logo textTech

Git Reset

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

git reset מעביר את הענף הנוכחי לקומיט אחר, ובהתאם למצב גם מעדכן את אזור ההכנה (index) ואת עץ העבודה כך שיתאימו. שלושת המצבים שונים רק בהיקף העדכון: --soft מזיז את הענף ועוצר, --mixed (ברירת המחדל) גם מאפס את אזור ההכנה, ו---hard גם דורס את קובצי העבודה שלכם.

מכיוון ש---hard מוחק עבודה שלא נשמרה בקומיט, דעו איזה מצב אתם רוצים לפני שאתם מריצים אותו. בקומיטים שכבר דחפתם, עדיף להשתמש ב-git revert. נסו את הפקודות בבטחה בעורך הטרמינל אונליין: shell אמיתי בדפדפן.

git reset מחזיר את HEAD לקומיט מוקדם יותר; הקומיטים שאחריו יוצאים מהענף, אבל אפשר לשחזר אותם דרך reflog.

שלושת המצבים

מצבמזיז את הענףמאפס את אזור ההכנהמאפס את עץ העבודה
--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 מלמד איפוס וביטול שינויים צעד אחר צעד.
איור של שפות התכנות ב-Coddy

ללמוד Git עם Coddy

להתחיל