שמירה זמנית (Stash)
git stash הוא כלי לשמירה זמנית של שינויים שעוד לא מוכנים ל-commit. הוא מאפשר לכם "להזיז הצידה" את העבודה הנוכחית, לעבור ל-branch אחר או לעשות משהו דחוף, ולחזור אחר כך לשינויים.
מתי להשתמש?
- אתם באמצע פיצ'ר ופתאום צריך לתקן באג דחוף ב-main
- אתם רוצים לעשות
git pullאבל יש לכם שינויים לא commited - ניסית משהו ואתם רוצים לשמור לזמן קצר בלי ליצור commit
פקודות בסיסיות
git stash # שמירת השינויים הנוכחיים
git stash save "WIP login" # עם הודעה (תחביר ישן)
git stash push -m "WIP login" # עם הודעה (תחביר חדש)
git stash -u # כולל untracked files
git stash -a # גם untracked וגם ignored
הפקודה git stash שומרת:
- שינויים בקבצים tracked
- שינויים ב-staging area
ולא שומרת (כברירת מחדל): - קבצים untracked - קבצים ignored
צפייה ב-stashes
git stash list # רשימת כל ה-stashes
# stash@{0}: WIP on main: a3f5c2d Add login form
# stash@{1}: On feature/x: WIP login
git stash show # סיכום של ה-stash האחרון
git stash show -p # diff מלא של ה-stash האחרון
git stash show stash@{1} # stash ספציפי
שחזור (apply ו-pop)
יש שתי דרכים להחזיר stash:
git stash pop # שחזור + מחיקה מהרשימה
git stash apply # שחזור בלי מחיקה
git stash apply stash@{1} # שחזור stash ספציפי
| pop | apply | |
|---|---|---|
| משחזר את השינויים | ✅ | ✅ |
| מוחק את ה-stash מהרשימה | ✅ | ❌ |
| מסוכן (אובדן עבודה אם יש קונפליקט) | יותר | פחות |
טיפ: אם אתם לא בטוחים, השתמשו ב-apply קודם. אם הכל עבד טוב, מחקו ידנית עם git stash drop.
מחיקה
git stash drop # מחיקת ה-stash האחרון
git stash drop stash@{1} # מחיקת stash ספציפי
git stash clear # מחיקת כל ה-stashes
⚠️ אחרי
clearאין דרך פשוטה לשחזר. רק דרךgit fsckובמאמץ.
דוגמת זרימה: באג דחוף באמצע פיצ'ר
# אתה באמצע עבודה על feature/dashboard
git status
# יש שינויים לא commited
# מגיע באג דחוף ב-main
git stash push -m "WIP dashboard"
# עוברים ל-main
git switch main
git pull
# יוצרים hotfix
git switch -c hotfix/critical-bug
# ...מתקנים...
git add .
git commit -m "Fix critical login bug"
git push -u origin hotfix/critical-bug
# חוזרים לפיצ'ר
git switch feature/dashboard
git stash pop
# ממשיכים לעבוד מאיפה שהפסקת
טעויות נפוצות
"לא רואה שינויים אחרי stash"
git stash list
ודאו שה-stash נשמר. אם הוא מופיע ברשימה - הכל בסדר, רק הריצו git stash pop.
"stash pop גרם לקונפליקט"
זה קורה כשעבר זמן מאז ה-stash וה-branch השתנה. הפתרון:
1. פותרים את הקונפליקט כרגיל (כמו ב-merge)
2. מסמנים git add על הקבצים המתוקנים
3. אם השתמשת ב-pop והקונפליקט נפתר, ה-stash נשאר ברשימה - מחקו ידנית עם git stash drop
"שכחתי על stash מלפני חודש"
git stash list
תמיד בדקו לפני שאתם מנקים. ההיסטוריה של stashes לא מוצגת ב-git log הרגיל.
אלטרנטיבה: WIP commit
יש מי שמעדיפים להימנע מ-stash ופשוט ליצור commit זמני בשם "WIP" (Work In Progress):
git add .
git commit -m "WIP"
# ...עושים מה שצריך...
git reset --soft HEAD~1 # מבטלים את ה-WIP commit
לכל שיטה יש יתרונות. stash שומר את הרשימה נקייה, WIP commit פחות מסוכן לאיבוד.
בדקו את עצמכם
נסו לענות לבד לפני שאתם פותחים את התשובה.
-
מתי משתמשים ב-
git stash?הצגת התשובה
תשובה ד. git stash pop מחזיר אותם.