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 |