--- name: checkpointing description: How checkpointing works for tracking file changes and rewinding to previous states. Use when user asks about checkpoints, rewinding, rollback, undo, or restoring previous states. --- # Claude Code Checkpointing ## Overview Claude Code includes an automatic checkpointing system that tracks file edits and allows users to recover from unwanted changes during development sessions. ## How Checkpointing Works ### Automatic Tracking The system captures code states before each modification. **Key features:** - Every user prompt creates a new checkpoint - Checkpoints persist across resumed conversations - Automatic cleanup occurs after 30 days (configurable) ### What Gets Tracked **Tracked:** - Direct file edits via Edit tool - File creations via Write tool - File modifications by Claude **Not tracked:** - Files modified by bash commands (`rm`, `mv`, `cp`) - Manual file modifications outside Claude Code - Changes from concurrent sessions (unless they affect files the current session modified) ## Rewinding Changes ### Access Rewind Menu **Keyboard shortcut:** Press `Esc` twice (quickly) **Slash command:** ``` /rewind ``` ### Restoration Options When you open the rewind menu, you have three options: #### 1. Conversation Only **Keeps:** All code changes **Reverts:** Conversation history to selected checkpoint **Use when:** - You want to start conversation over - Code changes are good - You want to try different approach in conversation #### 2. Code Only **Keeps:** Conversation history **Reverts:** Files to selected checkpoint **Use when:** - Recent changes broke something - Want to undo code changes - Conversation context is valuable #### 3. Both Code and Conversation **Reverts:** Everything to selected checkpoint (full rollback) **Use when:** - Complete do-over needed - Both code and conversation went wrong - Want to return to known good state ### Selecting a Checkpoint Checkpoints are displayed with: - Timestamp - User prompt that created it - Files affected - Changes summary Navigate with arrow keys and select with Enter. ## Use Cases ### Testing Different Approaches **Scenario:** Try multiple implementation strategies without losing starting point. ``` # Approach 1 "implement feature using strategy A" # Review, not ideal # Rewind Esc Esc → Select checkpoint → Code only # Approach 2 "implement feature using strategy B" # Better! ``` ### Quick Bug Recovery **Scenario:** Recent changes introduced a bug. ``` # Make changes "refactor the authentication module" # Oops, broke login # Rewind Esc Esc → Select checkpoint before refactor → Code only # Try again differently "refactor authentication but keep existing login flow" ``` ### Iterative Development **Scenario:** Preserve working states while iterating. ``` # Working state 1 "add basic user validation" # Works ✓ # Iterate "add more complex validation rules" # Issues found # Return to working state Esc Esc → Code only # Try different iteration "add regex-based validation" ``` ### Conversation Reset **Scenario:** Conversation got confused or went off track. ``` # Good code changes made "add user profile endpoint" "add user settings endpoint" # Conversation gets confusing # Want to restart conversation but keep code # Rewind conversation only Esc Esc → Conversation only → Select early checkpoint # Fresh conversation start with code intact ``` ## Important Limitations ### Bash Command Changes Not Tracked **Not captured:** ``` !rm file.txt !mv old.txt new.txt !cp source.txt dest.txt !git checkout -b new-branch ``` **Why:** Bash commands run outside Claude's file tracking system. **Workaround:** - Use Claude's Edit/Write tools instead when possible - Manually track bash file operations - Use git for version control of important changes ### External Changes Not Tracked **Not captured:** - Manual edits in your text editor - IDE refactorings - File system operations outside Claude Code - Changes from other tools **Workaround:** - Use git to track all changes - Create manual checkpoints with git commits - Be aware of what Claude modified vs what you modified ### Concurrent Session Caveats **Limited tracking:** If multiple Claude Code sessions modify the same files, only changes from the current session are tracked for checkpointing. **Best practice:** Use one Claude Code session at a time per project. ## Not a Version Control Replacement ### Checkpointing vs Git | Feature | Checkpointing | Git | |---------|--------------|-----| | **Scope** | Session-level | Repository-wide | | **Duration** | 30 days | Permanent | | **Granularity** | Per prompt | Per commit | | **Collaboration** | Single user | Team | | **Purpose** | Session recovery | Version control | | **Bash tracking** | No | Yes | ### Use Both Together **Git for:** - Permanent history - Collaboration - Branch management - All file changes (including bash) - Release management **Checkpointing for:** - Quick session rollback - Trying different approaches - Recovering from mistakes - Conversation management - Rapid iteration **Recommended workflow:** ``` # Regular git commits for milestones git commit -m "Working authentication" # Use checkpointing for rapid iteration "try optimization A" Esc Esc → rewind if not good "try optimization B" Esc Esc → rewind if not good "try optimization C" # This one works! # Commit the winner git add . git commit -m "Optimized authentication" ``` ## Configuration ### Checkpoint Retention **Default:** 30 days **Configure retention:** Edit `.claude/settings.json`: ```json { "checkpointRetentionDays": 60 } ``` ### Disable Checkpointing **Not recommended**, but possible: ```json { "enableCheckpointing": false } ``` ## Best Practices ### 1. Review Before Rewinding **Look at:** - What checkpoint contains - What will be lost - What will be kept **Avoid:** - Blindly selecting checkpoints - Rewinding without understanding impact ### 2. Use Descriptive Prompts **Good (easy to identify):** ``` "add email validation to user registration" "refactor database queries for performance" ``` **Bad (hard to identify):** ``` "make changes" "fix it" ``` Checkpoints show your prompts, so descriptive prompts make checkpoint selection easier. ### 3. Combine with Git ``` # Checkpoint for rapid iteration Try approach → rewind → try approach → rewind # Git for confirmed changes git add . git commit -m "Final implementation" ``` ### 4. Rewind Code, Not Conversation **Often better:** Rewind code only and keep conversation history. **Why:** - Maintains context - Claude learns from mistakes - Can explain what went wrong - Better for iterative improvement ### 5. Regular Git Commits Don't rely solely on checkpoints: ``` # After significant progress git add . git commit -m "Checkpoint: working user authentication" # Continue with Claude Code # Checkpointing handles rapid iteration # Git handles permanent milestones ``` ## Troubleshooting ### Checkpoint Not Showing Expected State **Possible causes:** - Changes made via bash commands (not tracked) - External file modifications - Concurrent session changes - Checkpoint expired (>30 days) **Solution:** - Use git for those scenarios - Check git history: `git log` - Review git diff: `git diff` ### Can't Find Recent Checkpoint **Check:** - Are you in the right directory? - Is this the same session? - Did checkpoint expire? **Solution:** - Use `/rewind` command instead of Esc Esc - Check session history - Verify working directory ### Rewind Not Working **Check:** - Are files write-protected? - Do you have filesystem permissions? - Are files open in another program? **Solution:** - Close files in editors - Check file permissions - Ensure no file locks ## Example Workflows ### Refactoring Safely ``` # Current working state git commit -m "Pre-refactor checkpoint" # Try refactoring "refactor user controller for better error handling" # Test !npm test # If tests fail Esc Esc → Code only → Return to pre-refactor # Try different approach "refactor user controller with focus on backward compatibility" # If tests pass git commit -m "Refactored user controller" ``` ### Feature Experimentation ``` # Baseline working git commit -m "Baseline" # Experiment 1 "add feature using approach A" # Review, note pros/cons # Rewind Esc Esc → Code only # Experiment 2 "add feature using approach B" # Compare, choose better # If experiment 2 is better git commit -m "Added feature using approach B" # If neither was good Esc Esc → Code only → Back to baseline ``` ### Conversation Management ``` # Making good progress "implement auth" "add user roles" "add permissions" # Conversation gets complex/confused Esc Esc → Conversation only → Select first checkpoint # Start fresh conversation "explain the architecture we just built" # Code intact, conversation reset ```