שמירה זמנית (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 פחות מסוכן לאיבוד.

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. מתי משתמשים ב-git stash?

    1. לפרסום
    2. למחיקת ענף
    3. לגיבוי קבוע
    4. כדי להזיז הצידה שינויים לא גמורים, לעבור ענף ולחזור אליהם
    הצגת התשובה

    תשובה ד. git stash pop מחזיר אותם.