Source Code Management
jj workflow for preserving all work. Nothing is ever lost.
Core Principle
Every change is automatically tracked. In jj, working copy (@) is always a commit. No staging area. Every save is part of the current commit.
Rules
Commit after every testable change - After each TDD cycle, run
jj commit -m "msg". Don't batch. Worktree gets squash-merged anyway.Finalize before destructive ops - Before
jj restore,jj abandon, or ending session: commit first.Experiments: commit, try, backout - Commit the experiment, evaluate, then
jj backout -r @-if discarding. History preserved.Unknown changes: preserve first - Never
jj restoreunknown changes. Commit checkpoint, then investigate withjj diff -r @-.Deleting code: commit, then delete - Checkpoint before removing so you can recover from history.
Why This Matters
- Recovery: Any past state is one
jj editaway - Confidence: Experiment freely knowing nothing is lost
- Squash merge: All commits collapse to one clean commit at release
Anti-patterns
| Don't | Do Instead |
|---|---|
jj restore without thinking |
Commit first |
jj abandon without checking |
Verify commit is unwanted |
| Batch changes in one commit | Commit after each testable change |
| Leave session without finalizing | Commit before stopping |