איך מבטלים שינויים ב-Claude Code: /rewind ו-git
Markdownמצבי חזרה לאחור, מגבלות נקודות הביקורת, git checkout, stash, reflog והגנה מפני פקודות הרסניות. חמש דרכים לשחזר מצב.
קריאת המאמר המלא
מידע מעשי על עבודה עם Ailoot זמין בתיעוד.
מהי ביטול ב-Claude Code, ולמה שלוש רמות אינן מספיקות?
נקודות מרכזיות
לביטול ב-Claude Code יש שלוש רמות: הפקודה המובנית /rewind (שחזור מיידי בתוך סשן), git checkout (שחזור למצב של הקומיט האחרון), ו-git reflog (רשת ביטחון למקרה חירום אם מישהו הריץ git reset --hard). כל רמה מתמודדת עם סוג שגיאות משלה ולא חורגת מגבולותיה. אם מכירים רק את /rewind, נשארים חסרי הגנה מול התקלה הרצינית הראשונה.
הפעלתי את /rewind בשבוע הראשון שלי עם Claude Code, אחרי שהוא שיבש את לוגיקת האימות בפרויקט שלי בשתי הנחיות. חזרתי לאחור, נשמתי לרווחה והמשכתי. חודש אחר כך קרה מקרה נוסף: כתבתי הגירת סכימה, Claude עזר לי, ביצעתי commit, עברתי לענף אחר — ואז הבנתי ששכחתי שלב הכרחי. /rewind לא עזר — הסשן כבר היה אחר. git checkout לקומיט הקודם עזר. חודש לאחר מכן אמרתי לסוכן בטעות: „תחזיר הכול למצב של ה-push האחרון”, והוא הריץ git reset --hard והרס שלוש שעות עבודה. git reflog הציל אותי — הגיבובים של הקומיטים שנהרסו עדיין היו שם.
שלושת הסיפורים האלה מייצגים שלוש רמות הגנה שעובדות בדרכים שונות, תופסות שגיאות שונות ונחוצות כולן. המדריך הזה מסביר כל רמה, עם הפקודות, המגבלות והדוגמאות שלה, ומראה גם כיצד להגדיר פרויקט מראש כדי ש-Claude לא יפיל אותו בפעם הראשונה.
3 רמות ביטול — מה ומתי:
| רמה | פקודה | מכסה | לא מכסה |
|---|---|---|---|
| 1. בתוך סשן | /rewind או Esc Esc | קבצים ש-Claude שינה באמצעות הכלים שלו; היסטוריית השיחה | פקודות Bash, עורכים חיצוניים, הגירות מסד נתונים |
| 2. לפני commit | git checkout . או git stash | כל השינויים שלא בוצע להם commit בקבצים | קומיטים שכבר בוצעו |
| 3. אסון | git reflog + git reset --hard <hash> | קומיטים שנהרסו באמצעות reset --hard או force-push | פקודות Bash הרסניות (rm, הגירות מסד נתונים) |
בהמשך נעבור על כל רמה — מה בדיוק לעשות, אילו מלכודות יש, ואיך להגדיר את הדברים כך שלא יהיה מה לבטל, כי שום דבר לא נשבר.
איך מפעילים את /rewind: בפקודה או באמצעות Esc-Esc?
נקודות מרכזיות
יש שתי דרכים לפתוח את תפריט Rewind ב-Claude Code. הראשונה היא להקליד /rewind בשדה הקלט. השנייה היא ללחוץ פעמיים על Esc כשהשדה ריק. אם יש בשדה טקסט, לחיצה כפולה ראשונה על Esc מנקה אותו ושומרת את תוכנו בהיסטוריית הקלט; לחיצה כפולה נוספת פותחת את התפריט. הפקודה /rewind היא כינוי גם ל-/checkpoint.
אחרי כל תשובה, Claude יוצר אוטומטית תמונת מצב של כל הקבצים שערך באותו סשן. תמונות המצב נשמרות ב-~/.claude/file-history/{sessionId}/ ונשמרות עד 30 יום. תמונות המצב הן מצטברות — נשמרים רק ההבדלים בין המצבים, ולא הקובץ כולו. כברירת מחדל נשמרות עד 100 תמונות מצב בכל סשן. פירוש הדבר שברוב הפרויקטים האמיתיים יש לכם בכל רגע היסטוריה מלאה של כל השינויים ש-Claude ביצע במהלך יום העבודה.
כדי לפתוח את תפריט החזרה לאחור, לחצו פעמיים על Esc כשהשדה ריק:
[user-input is empty]
> _
[press Esc, Esc]
Rewind to which message?
1. Create a migration for the User table (3 files changed)
2. Add the lastLoginAt field (1 file changed)
3. Rewrite the authorization logic (5 files changed)
...
אם יש טקסט בשדה הקלט, הלחיצה הכפולה הראשונה על Esc מנקה אותו ושומרת אותו בהיסטוריית הקלט של Up. זה שימושי אם כבר התחלתם להקליד ואז הבנתם שאתם צריכים לחזור לאחור. הנה ציטוט מהתיעוד הרשמי של Anthropic:
אם יש טקסט בשדה ההנחיה, לחיצה כפולה על Esc קודם תנקה אותו במקום לפתוח את התפריט. הטקסט שנוקה נשמר בהיסטוריית הקלט, כך שאפשר לשחזר אותו באמצעות החץ למעלה אחרי תפריט החזרה לאחור.
הפקודה /rewind עושה אותו דבר — היא פותחת את התפריט. יש גם כינוי, /checkpoint, שמוביל לאותו מקום. איזו שיטה נוחה יותר תלוי בהרגל. אני משתמש ב-Esc Esc — זה מהיר יותר ולא מחייב להוריד את הידיים מהמקלדת.
6 מצבים בתפריט Rewind: במה לבחור ומתי?
נקודות מרכזיות
אחרי שבוחרים נקודת חזרה בתפריט Rewind, מופיע תפריט שני ובו שישה מצבים. שלושה משחזרים מצב (Restore code and conversation, Restore conversation, Restore code), שניים דוחסים את ההיסטוריה (Summarize from here, Summarize up to here), ואחד מבטל את הפעולה (Never mind). התרחיש הנפוץ ביותר — „לחזור לאחור גם בקוד וגם בשיחה” — הוא האפשרות הראשונה.
בחרו נקודה ברשימה, ותגיעו לתפריט הפעולות. יש בו שישה פריטים, וכל אחד עושה משהו אחר.
טבלה מלאה של המצבים:
| מצב | מה הוא עושה | מתי לבחור בו |
|---|---|---|
Restore code and conversation | משחזר את הקבצים ואת היסטוריית השיחה לנקודה שנבחרה | התרחיש הנפוץ ביותר: Claude סטה מהכיוון הנכון, ואני רוצה להתחיל מחדש עם ניסוח מתאים |
Restore conversation | מחזיר לאחור רק את היסטוריית השיחה; הקבצים נשארים כפי שהם עכשיו | הקוד טוב, אבל השיחה סטתה מהמסלול; אנסח מחדש מנקודה זו ואשמור על השינויים הנוכחיים |
Restore code | מחזיר את הקבצים לאחור; השיחה נשארת כפי שהיא | חלק מהשינויים של Claude היו מיותרים, אבל עדיין נחוץ לי ההקשר מהשיחה (למשל, סיכמנו על השלבים הבאים) |
Summarize from here | דוחס לסיכום את כל מה שאחרי הנקודה שנבחרה. לא משנה קבצים | סשן ניפוי שגיאות ארוך ניצל את ההקשר; אני צריך לפנות מקום ולשמור את ההנחיות הראשוניות במלואן |
Summarize up to here | דוחס לסיכום את כל מה שלפני הנקודה שנבחרה. לא משנה קבצים | הייתה תדריך פתיחה ארוך ואחריו משימה מסוימת — נדחוס את התדריך להודעה אחת ונשאיר את העבודה האחרונה כפי שהיא |
Never mind | סוגר את התפריט בלי לבצע שינויים | שיניתי את דעתי |
התכונה Summarize up to here הופיעה ב-Claude Code v2.1.139-v2.1.142, שיצא לאור ב-11–15 במאי 2026, בשבוע 20:
אפשר לדחוס את ההקשר המוקדם דרך תפריט Rewind באמצעות 'Summarize up to here'.
ההבדל בין Restore ל-Summarize מהותי. Restore מחזיר למצב קודם ומבטל את כל מה שקרה אחרי הנקודה שנבחרה. Summarize לא מבטל דבר; הוא רק דוחס — ההודעות המקוריות נשארות בתמליל הסשן לעיון, אבל רק הסיכום נשאר בהקשר הפעיל. השתמשו ב-restore כשרוצים שהמצב יהיה „כאילו זה מעולם לא קרה”. השתמשו ב-summarize כשרוצים „לשמור את זה, אבל בלי לתפוס מקום בהקשר”.
אחרי Restore conversation או Summarize from here, הטקסט המקורי של ההנחיה שנבחרה חוזר לשדה הקלט — אפשר לערוך אותו ולשלוח שוב. אחרי Summarize up to here, שדה הקלט ריק, ואתם נשארים בסוף השיחה.
אילו שינויים /rewind לא מבטל?
נקודות מרכזיות
/rewind עוקב רק אחר שינויים ש-Claude ביצע באמצעות כלי עריכת הקבצים שלו. הוא לא יכול לראות או לשחזר שום דבר אחר. יש שלוש קבוצות של שינויים בלתי נראים: פקודות Bash (rm, mv, cp), עריכות חיצוניות (עריכות ידניות שלכם ב-IDE ושינויים מסשנים אחרים), ופעולות מחוץ לקבצים (הגירות מסד נתונים, git push, קריאות API מרוחקות).
זו המגבלה העיקרית שאנשים נתקלים בה: /rewind מציג סימן אישור ירוק ואומר „החזרה לאחור הצליחה”, אבל הפרויקט עדיין שבור כי Claude נגע ביותר מקבצים בלבד. נבחן את שלושת המקרים.
1. פקודות Bash אינן מתועדות. אם Claude מריץ rm file.txt או mv old.txt new.txt בתור, השינויים האלה לא ייכללו בנקודת הביקורת. התיעוד של Anthropic מציין זאת במפורש:
מעקב נקודות הביקורת אינו מתעד קבצים ששונו באמצעות פקודות Bash. לדוגמה, אם Claude Code מריץ rm file.txt, mv old.txt new.txt או cp source.txt dest.txt, אי אפשר לבטל את שינויי הקבצים האלה באמצעות החזרה לאחור.
פירוש הדבר הוא שאם Claude מוחק, מעביר או מעתיק קובץ בעצמו באמצעות כלי Bash, /rewind לא ישחזר הכול. git checkout או שחזור מגיבוי יכולים לעזור, אבל הדבר דורש יותר מלחיצה על שני מקשים.
2. עריכות חיצוניות אינן נלכדות. אם פתחתם קובץ ידנית ב-VS Code וערכתם אותו, או סשן Claude שני משנה את אותם קבצים במקביל, הסשן הראשון לא יכול לראות את השינויים האלה. תמונת מצב של נקודת ביקורת נוצרת כש-Claude מסיים תור בסשן הנוכחי. מה שקורה בין תורים אינו באחריותה.
3. פעולות מחוץ לקבצים אינן מכוסות כלל. הגירת Prisma שהוחלה באמצעות npx prisma migrate dev שינתה את סכימת מסד הנתונים — /rewind לא יבטל אותה, כי מסד הנתונים נמצא מחוץ למערכת הקבצים של הפרויקט. force-push אל origin/main הוא אותו סוג פעולה: הקומיט הגיע לשרת המרוחק, ונקודת הביקורת לא תחזיר אותו. קריאת API מרוחקת שחייבה כסף או מחקה רשומה אפשר לבטל רק באמצעות המנגנונים של ה-API עצמו.
כלל: אם משימה משפיעה על משהו מחוץ לקובצי הפרויקט — הגירות מסד נתונים, git push או APIs מרוחקים — הכינו אסטרטגיית rollback נפרדת לכל השפעה חיצונית. /rewind הוא היסטוריית הקבצים המקומית בלבד, בתוך הסשן הנוכחי.
/rewind לעומת git: מה ההבדל ביניהם, ולמה צריך את שניהם?
נקודות מרכזיות
/rewind הוא החזרה מקומית לאחור בתוך סשן Claude Code יחיד. הוא שומר תמונות מצב מצטברות עד 30 יום, ועד 100 בכל סשן. git הוא היסטוריה ארוכת טווח של הפרויקט, משותפת לצוות, עם ענפים, התנגשויות מיזוג ומאגר מרוחק. אחד לא מחליף את השני. הנוהג המומלץ הוא לבצע git commit בכל אבן דרך לוגית ולהסתמך על /rewind בין הקומיטים.
התיעוד של Anthropic מציין במפורש את השילוב הזה:
נקודות ביקורת נועדו לשחזור מהיר ברמת הסשן. עבור קומיטים, ענפים והיסטוריה ארוכת טווח, המשיכו להשתמש במערכת בקרת גרסאות (לדוגמה, Git). נקודות ביקורת משלימות את בקרת הגרסאות הרגילה, אך אינן מחליפות אותה. חשבו על נקודות ביקורת כעל 'ביטול מקומי' ועל Git כעל 'היסטוריה קבועה'.
ההבדלים בטבלה אחת:
| מאפיין | /rewind | git |
|---|---|---|
| רמת פירוט | כל תור בשיחה | כל commit |
| אחסון | עד 30 יום, עד 100 בכל סשן, באופן מקומי ב-~/.claude/file-history/ | לצמיתות, במאגר .git/ ובשרת המרוחק |
| מה מתועד | עריכות של Claude באמצעות הכלים שלו | כל השינויים שבוצע להם commit |
| מה לא מתועד | Bash, עריכות חיצוניות, הגירות, push | שינויים שטרם בוצע להם commit |
| פקודה | פקודה בתוך Claude | מערכת בקרת גרסאות חיצונית |
| מחזיר את השיחה לאחור | כן | לא |
| עובד בין סשנים | רק בתוך אותו סשן | בכל מקום |
השילוב פשוט: בכל פעם שמגיעים למצב שבו „זה עובד, ואני לא רוצה לאבד את זה”, מבצעים git commit. בין קומיטים מסתמכים על /rewind — הוא מיידי, לא דורש הודעת commit ולא מעמיס על היסטוריית git במצבי ביניים. כשהעבודה מסתיימת, מבצעים commit — ועדיף שיהיה משמעותי ואטומי.
למה /rewind אחד לא מכסה את כל המשימה?
ביטול הוא מקרה אחד של הנדסת הקשר. נהלו את ההקשר בסשן (מתי לבצע commit, מתי ללחוץ על /rewind, אילו כללים להכניס ל-CLAUDE.md), ותקבלו Claude צפוי שלא הורס את הפרויקט או מאבד עבודה.
למה git reset --hard מסוכן כשמבקשים מ-Claude „לחזור לאחור”?
נקודות מרכזיות
בשפה טבעית, „לחזור לאחור” פירושו „לעיין בהיסטוריה”, לא „להרוס אותה”; כברירת מחדל Claude צריך להציע git checkout, ולא reset --hard; את ההגנה מגדירים ב-CLAUDE.md.
בקשה „לשמור את המצב הנוכחי ולחזור למצב של ה-push האחרון” עלולה להוביל לפקודות האלה:
git stash save "WIP: Tracker enter/leave disabled + fsSyncModule fix" # saved uncommitted changes
git reset --hard 35eb731 # destroyed commits d63695e..882e618
הפקודה הראשונה הייתה נכונה — היא שמרה את השינויים שטרם בוצע להם commit ב-stash. השנייה הייתה הרסנית: היא שכתבה את הענף לקומיט 35eb731, וכל הקומיטים שבינו לבין 882e618 הפכו ליתומים. כברירת מחדל, קומיטים יתומים נשארים ב-.git/objects/ עד ש-git gc רץ, מה שבדרך כלל מתרחש אוטומטית בתוך שבועיים. אבל אם לא ידעתם מה לעשות באותו רגע, הזמן כבר פעל לרעתכם.
ההיגיון פשוט: בשפה טבעית, „לחזור לאחור”, „לחזור”, „לשחזר”, „להחזיר” ו„לבטל” פירושם „להסתכל אחורה” או „לחזור למקום בטוח”. הם לא פירושם „להרוס את ההיסטוריה”. הפקודה git reset --hard הורסת אותה — היא משכתבת את הענף ומסירה קומיטים מבין אלה שנגישים דרך HEAD. חלופה בטוחה היא git checkout <commit>, שיוצרת HEAD מנותק ומאפשרת לראות את המצב הישן בלי לגעת בענפים.
הלקח המעשי העיקרי הוא לבצע git commit למצב הנוכחי לפני כל משימה משמעותית, במיוחד לפני שינוי מבני בכמה קבצים. commit אחד הופך כל טעות של Claude לפקודת git checkout . אחת, בלי לאבד עבודה.
איך git reflog מציל אתכם אחרי איפוס הרסני?
נקודות מרכזיות
git reflog מציג את ההיסטוריה המקומית של כל תנועות HEAD במאגר — אפילו קומיטים שהוסרו באמצעות git reset --hard או force-push. כל תנועה נשמרת כברירת מחדל למשך 90 יום. אם Claude (או אתם או מישהו אחר) הרס קומיטים באמצעות פקודה הרסנית, git reflog יציג את הגיבובים שלהם, ותוכלו לשחזר את הענף באמצעות git reset --hard <reflog-hash>.
אחרי reset הרסני, הריצו git reflog מיד:
git reflog
כך נראה הפלט:
35eb731 HEAD@{0}: reset: moving to 35eb731
882e618 HEAD@{1}: commit: middleware refactoring complete
d63695e HEAD@{2}: commit: leaveRemove method finalized
1f9c8a3 HEAD@{3}: commit: tracker enter/leave disabled
35eb731 HEAD@{4}: pull origin main
HEAD@{1} עד HEAD@{3} הם אותם קומיטים „הרוסים”. הם לא נעלמו ממאגר האובייקטים המקומי של git; הם פשוט נעשו בלתי נגישים דרך הענף. כדי לשחזר אותם:
# Create a branch from the last “destroyed” commit
git branch recovered-work 882e618
# Or switch directly
git reset --hard 882e618
אחרי זה, הענף שוב מכיל את כל ההיסטוריה עד האסון.
מגבלות reflog:
- מקומי בלבד. ה-reflog נשמר ב-
.git/logs/HEAD; הוא לא נמצא במאגר המרוחק. אם ביצעתם force-push ואז מחקתם את העותק המקומי של המאגר, ה-reflog ייעלם יחד עם התיקייה. - 90 יום כברירת מחדל. ערכים ישנים יותר עלולים להימחק על ידי git gc. אפשר להגדיר זאת באמצעות
git config gc.reflogExpire 200.days.ago. - לא מכסה מה שמעולם לא היה ב-HEAD. אם commit היה רק ב-stash וה-stash הושמד, ה-reflog יציג רק את המצב האחרון של ה-stash, ולא את ההיסטוריה הפנימית שלו.
כלל לצוות: לעולם אל תריצו git gc --aggressive מיד אחרי אסון. קודם חקרו באמצעות reflog ושחזרו; את כל השאר עשו אחר כך. ואל תמחקו לעולם את השיבוט המקומי של המאגר לפני שאתם בטוחים שכל מה שנחוץ לכם נדחף לשרת.
איך מגינים על פרויקט מפני פקודות git הרסניות באמצעות CLAUDE.md?
נקודות מרכזיות
ב-CLAUDE.md של הפרויקט הוסיפו מקטע הנחיות שמגדיר אילו פקודות git Claude רשאי להריץ בעצמו, אילו דורשות אישור מפורש ואילו אסורות בלי ביטוי מדויק מהמשתמש. Claude מתייחס ל-CLAUDE.md כהנחיית המערכת של הפרויקט ופועל לפי הכללים האלה כברירת מחדל. כך הופכים הנחיה „מסוכנת” אחת לשתי פקודות בטוחות.
הפגיעוּת היא של-Claude אין הקשר הגנתי כברירת מחדל. הוא מפרש „לחזור לאחור” בתור git reset --hard, כי מבחינה טכנית זו שיטה תקפה. הוסיפו את ההגנה ל-CLAUDE.md — קובץ הנחיית המערכת של הפרויקט.
כלל מינימלי (הוסיפו ל-CLAUDE.md שלכם):
## Git Safety Protocol
- NEVER run destructive git commands (push --force, reset --hard, checkout ., restore ., clean -f, branch -D) unless I explicitly request these actions. Taking unauthorized destructive actions is unhelpful and can result in lost work.
- When I say "roll back", "go back", "restore", "revert", "undo" - interpret as REVIEW commands: use `git log`, `git diff`, `git checkout <commit>` (creates detached HEAD), or `git stash` (preserves changes).
- ALWAYS ask for confirmation before ANY command that:
- Changes HEAD position to a different commit on a branch
- Modifies commit history
- Could lose uncommitted work
- Includes flags --hard, --force, --aggressive
- Before any destructive command, output a numbered comparison:
- SAFE: use `git checkout <commit>` to view temporarily
- DESTRUCTIVE: use `git reset --hard` to permanently destroy
- Wait for my explicit choice before executing.
כלל מורחב לצוות (הוסיפו ל-CLAUDE.md שבשורש המאגר):
## Git Workflow Rules
- בצעו commit בכל אבן דרך עובדת. לפני commit של עבודה בתהליך, הריצו `git status` ו-`git diff`, הוסיפו לאזור ההכנה רק קבצים בשמות מפורשים שבדקתם באמצעות `git add -- path/to/file`, ואז בדקו את הבדלי הקבצים המוכנים לפני ה-commit. טיימר מזכיר לבדוק התקדמות; הוא אינו אישור להוסיף את כל עץ העבודה.
- Never use `git add .` or `git add -A` for commits by Claude. Only specify files by name, after `git status` + `git diff`.
- Before `git push --force` to main—stop and ask me. In feature branches, force-push cautiously, only if you're sure I'm willing to lose the previous version.
- When resolving merge conflicts, never choose "ours" or "theirs" immediately—show me both versions first, then I'll decide.
- `.gitignore` must contain `.env*`, `.claude/personal/`, `node_modules/`, `dist/`. If they're missing, add them.
אחרי שמוסיפים את המקטעים האלה, הביטוי הבא „תחזור למצב של ה-push האחרון” יוביל לתשובה כזו:
אני רואה 3 קבצים עם שינויים שטרם בוצע להם commit ו-4 קומיטים מאז ה-push האחרון. שתי אפשרויות:
- בטוחה: ליצור ענף
view-last-pushבאמצעותgit checkout <last-push-hash>— אשמור על כל העבודה, אבל אציג זמנית את המצב של ה-push.- הרסנית:
git reset --hard <last-push-hash>— אשמיד לצמיתות 4 קומיטים ואת השינויים שטרם בוצע להם commit. ניתן יהיה לשחזר אותם רק באמצעותgit reflogבתוך 90 יום. במה תבחרו?
זו חצי דקה של שיחה במקום ארבע שעות של עבודה אבודה.
מהן 5 הדרכים לבטל ב-Claude Code, ואיך בוחרים את הדרך הנכונה?
נקודות מרכזיות
אם משהו משתבש, יש חמש רמות של דחיפות: /rewind (בתוך סשן), git checkout . (שינויים שטרם בוצע להם commit), git checkout <commit> (חזרה לקומיט ישן בלי לאבד היסטוריה), git reset --hard <commit> (החזרת הענף לאחור תוך איבוד הקומיטים שאחריו), git reflog + שחזור (אסון, הכול נעלם). כל רמה כבדה ומסוכנת יותר מקודמתה.
התרחיש „Claude שבר את זה, אני צריך לשחזר בדחיפות” מתקדם מלמטה למעלה בסולם הזה. תמיד התחילו ברמה 1.
רמה 1. /rewind — ביטול מיידי בתוך סשן.
לחצו Esc Esc או הקלידו /rewind. בחרו את הנקודה שלפני התקלה. בחרו מצב (בדרך כלל Restore code and conversation). כעבור שנייה אתם שוב בעבר ויכולים להתחיל מחדש. מכסה 80% מהמקרים שבהם „Claude עשה את הדבר הלא נכון”.
רמה 2. git checkout . — ביטול כל השינויים שטרם בוצע להם commit.
git diff # first see what actually changed
git checkout . # undo all uncommitted changes in all files
# or selectively:
git checkout -- path/to/file.ts # only one file
שימושי כש-/rewind לא עבד (למשל, Claude נגע בקבצים באמצעות Bash) או כשצריך לבטל שינויים מחוץ להיסטוריית הסשן. כל השינויים שלא בוצע להם commit ייעלמו לצמיתות. אם אתם עלולים להתחרט, הריצו קודם git stash (ראו רמה 2.5).
רמה 2.5. git stash — מניחים את השינויים על המדף.
git stash save "might still need this"
# return to a clean state (without changes)
# ...
# if you change your mind—restore from stash:
git stash pop
זו פשרת ביניים טובה בין „לאבד לנצח” ל„להשאיר כפי שזה”. ה-stash נשאר מקומי עד שמנקים אותו במפורש.
רמה 3. git checkout <commit> — חזרה לקומיט ישן בלי לאבד היסטוריה.
git log --oneline # find the hash of the right commit, e.g. abc1234
git checkout abc1234 # detached HEAD—view without changing anything
# like the state? create a branch from it:
git checkout -b recovery abc1234
# return:
git checkout main
זו „חזרה זמנית” בטוחה. HEAD מנותק אינו משנה את הענף; העבודה הנוכחית שלכם ב-main (או בענף שבו הייתם) נשארת שלמה. אם רוצים לעבוד במצב הזה, יוצרים ענף.
רמה 4. git reset --hard <commit> — החזרת הענף לנקודה קודמת.
⚠️ הרסני. קומיטים שאחרי הגיבוב שצוין הופכים ליתומים.
git reflog # note the hash of the current state
git reset --hard abc1234 # rewrite the branch
# found a mistake? return through reflog:
git reset --hard HEAD@{1} # to where you were before the reset
השתמשו בכך רק אם אתם בטוחים שאינכם זקוקים לקומיטים שאחריו. ותמיד בדקו git reflog לפני האיפוס, כדי שתדעו לאן לחזור אם תשנו את דעתכם.
רמה 5. git reflog + שחזור — תרחיש קטסטרופלי.
מישהו (Claude, אתם או עמית) כבר הריץ git reset --hard או force-push ומחק את העבודה. מה עושים?
git reflog # look for the last hash before the disaster
git branch recovered HEAD@{N} # create a branch from it
git checkout recovered # switch to it
git diff main # compare with the current state
git checkout main && git merge recovered # restore into main, if you're sure
אם ה-reflog כבר נוקה (אחרי 90 יום כברירת מחדל), המוצא האחרון הוא git fsck --lost-found, שיציג קומיטים תלויים ב-.git/objects/. זו כמעט ארכאולוגיה, אבל לפעמים זה עובד.
כלל לבחירת רמה:
| מה קרה | רמה |
|---|---|
| Claude שכתב מחדש 3 קבצים בדרך הלא נכונה | 1. /rewind |
| ניסיתי, לא אהבתי, והסשן לא עוזר | 2. git checkout . |
| שברתי את זה ידנית, חבל לי לאבד, אולי אשחזר | 2.5. git stash |
| ביצעתי commit; צריך לחזור commit אחד לאחור | 3. git checkout <commit> |
| אני בטוח שאיני זקוק לקומיטים שאחריו | 4. git reset --hard |
| כבר מחקתי הכול בפקודה הרסנית | 5. git reflog |
איך מגינים על פרויקט כדי שלא יהיה מה לבטל?
נקודות מרכזיות
הביטול הטוב ביותר הוא זה שלא צריך. שלושה כללי הגנה: לבדוק התקדמות כל 30 דקות ולבצע commit של אבן דרך עובדת תוך הוספה מפורשת של הנתיבים שנבדקו בלבד; להוסיף את השורות הנדרשות .claude/personal/ ו-.env* אל .gitignore; ולבצע ניסויים גדולים בענף נפרד באמצעות git checkout -b experiment-<name>. כך מצמצמים את פער השחזור לקבצים שנשמרו ב-commit; מערכות חיצוניות ועבודה שטרם נשמרה ב-commit עדיין דורשות תוכנית שחזור משלהן.
כלל 1. מבצעים commit כל 30 דקות.
אל תחכו עד „שהמשימה תסתיים”. בצעו commit לכל שלב ביניים שעובד. הודעות commit יכולות להיות כל דבר; העיקר ש-Claude (או אתם) יוכלו לחזור למצב עובד באמצעות פקודת git checkout אחת.
# at the beginning of a task
git status # inspect all staged and unstaged paths
git diff # review the changes
# Replace this example path with the actual file you reviewed.
git add -- path/to/file.ts
git diff --cached # verify exactly what will be committed
git commit -m "wip: starting User schema migration"
# after 30 minutes (or after the first working iteration)
git status
git diff
git add -- path/to/file.ts # actual reviewed path, not a directory wildcard
git diff --cached
git commit -m "wip: User schema is ready, migration applied locally"
# at the end of the task—a meaningful commit
git reset --soft HEAD~2 # combine the three wip commits into one
git commit -m "feat(auth): add lastLoginAt field to User table"
אם תוסיפו תזכורת PostToolUse, שמרו על אותו כלל בדיקה והוספת נתיבים מפורשים לאזור ההכנה. אל תהפכו טיימר ל-commit אוטומטי ללא בדיקה: אחרת עריכות לא קשורות או קבצים שכבר הוכנו עלולים להיכלל ב-commit.
כלל 2. .gitignore מינימלי.
השורות האלה נדרשות בשורש הפרויקט:
# secrets
.env
.env.local
.env.*.local
# local Claude Code settings (not pushed to the team repository)
.claude/personal/
.claude/sessions/
.claude/file-history/
# dependencies and build
node_modules/
dist/
.next/
build/
אני שומר את התיקייה .claude/personal/ לניסויים ולהערות שלי, שאסור לכלול במאגר המשותף. התיקיות .claude/sessions/ ו-.claude/file-history/ הן האחסון המקומי של Claude Code; הן לא שייכות למאגר, תופסות מקום רב וקשורות למחשב מסוים.
כלל 3. עורכים ניסויים בענף נפרד.
אם המשימה גדולה (שינוי מבני ב-10+ קבצים, מעבר למסד נתונים חדש, שכתוב מודול), אל תעבדו בענף הראשי:
git checkout -b experiment/auth-rewrite
# work, commit every 30 minutes
# if it works:
git checkout main
git merge experiment/auth-rewrite
# if it doesn't:
git checkout main
git branch -D experiment/auth-rewrite # delete the branch
# that's it, the main branch is intact
ההרגל הפשוט הזה הופך את „Claude הרס את הפרויקט” ל„Claude הרס ענף אחד, מחקתי אותו ואנחנו מתחילים מחדש”.
כלל 4. לפני פעולות מסוכנות משתמשים ב-git tag.
לפני הגירת מסד נתונים, שינוי מבני גדול או עדכון תלות, יוצרים tag:
git tag pre-prisma-migration-v2
# work
# something went wrong:
git reset --hard pre-prisma-migration-v2
# or just take a look:
git checkout pre-prisma-migration-v2
Tag הוא מצביע בעל שם לקומיט שלא תאבדו גם אחרי ניקוי ה-reflog.
מה הלאה: איך ביטול משתלב בהנדסת הקשר?
נקודות מרכזיות
ביטול אינו מיומנות נפרדת, אלא חלק מניהול ההקשר של סשן Claude Code. כשאתם יודעים מתי ללחוץ על /rewind, מתי לבצע git commit ומתי להשתמש ב-git stash, אתם מנהלים תהליך עבודה שלם ולא פקודה אחת. זה חלק מהנדסת הקשר. בלעדיה Claude פועל כמו עוזר רגיל; איתה הוא פועל כמו כלי צפוי.
שלוש רמות הביטול האלה הן התשתית למיומנות אחת: לדעת לשחזר מצב כשהוא מתקלקל. המיומנות הזו צרה בפני עצמה. אבל בשילוב עם כלי הנדסת הקשר אחרים, היא הופכת למשהו רחב יותר.
Plan Mode לא מאפשר לכתוב קוד מיד — קודם באה התוכנית, אחר כך אישור, ורק אז ביצוע. זהו ביטול מונע: לא כותבים משהו שיצטרכו לבטל מאוחר יותר, כי התוכנית נבדקה מראש. קראו עוד במדריך ל-Plan Mode ב-Claude Code.
CLAUDE.md מגדיר כללים ש-Claude מכבד כברירת מחדל, כולל Git Safety Protocol שסקרנו למעלה. זוהי הגנה מונעת מפני פקודות הרסניות.
המוח השני נותן ל-Claude זיכרון על הפרויקט בין סשנים — הוא יודע איזה קוד יש לכם, מהי הלוגיקה העסקית ואילו הסכמות נעשו קודם. ככל שיש יותר זיכרון, כך קטן הסיכוי שיעשה את הדבר הלא נכון.
Skills וסוכני משנה הם המתודולוגיה שלכם בקוד. אם תהליך העבודה הנכון עם git מובנה ב-Skill, שום סוכן משנה לא יריץ git reset --hard בלי אישור.
וכל זה יחד הוא הנדסת הקשר. נהלו את ההקשר לפני ההנחיה, ולא במהלכה. קראו עוד ב-מהי הנדסת הקשר.
ביטול הוא קו ההגנה האחרון. Plan Mode + CLAUDE.md + Second Brain + Skills הם ארבעת הראשונים. כשהם מוגדרים, הביטול נעשה נדיר ומהיר. כשהם לא מוגדרים, הוא נעשה טקס יומי.
מקורות
הביטול מתחיל במקום שבו התכנון מסתיים.
פרטים נוספים
שאלות ותשובות: איך מבטלים שינויים ב-Claude Code: /rewind ו-git
האם נקודת ביקורת של עבודה בתהליך צריכה להשתמש ב-git add .?
לא. הריצו git status ו-git diff, הוסיפו לאזור ההכנה רק את הקבצים ששמם צוין ושבדקתם, ואז בדקו git diff --cached לפני ה-commit. נקודת ביקורת תקופתית אינה מתירה לכלול שינויים לא קשורים או שינויים שכבר היו באזור ההכנה.
האם /rewind יכול לבטל הגירת מסד נתונים או פעולה ב-API מרוחק?
לא. המדריך מגביל נקודות ביקורת לעריכות קבצים נתמכות בהפעלה. השפעות על מסד נתונים, Git מרוחק ו-API דורשות צעדי שחזור נפרדים; לקבצים שמחוץ לכיסוי נקודת הביקורת השתמשו ב-Git או בגיבוי.