Files

2.4 KiB

Squashing Changes

jj squash moves changes from one revision to another. The default is @ → its parent; pass --into to target any other change.

# Default: squash @ into its parent
jj squash

# Squash @ into a specific change (not the parent)
jj squash --into <change-id>
jj squash -t <change-id>                  # short form

# Squash a non-@ change into its parent
jj squash -r <change-id>

# Full explicit form: any source, any destination
jj squash --from <source-id> --into <destination-id>

# Squash only specific paths (the rest stay in the source)
jj squash path/to/file.txt
jj squash --into <change-id> src/auth/

Combined description prompt: if both source and destination have non-empty descriptions, jj squash opens an editor to pick a combined description — and hangs in agent environments. Always pass -m inline when squashing two described commits together:

jj squash --into <change-id> -m "feat: Combine auth changes"

Empty source: when squashing leaves the source revision empty (no content vs. its parent), jj abandons it by default. Pass --keep-emptied to keep an empty placeholder instead.

Interactive forms to avoid: jj squash -i / jj squash --interactive open a TUI and will hang in agent environments. Use --from / --into / paths instead.

Splitting Commits

Warning: jj split is interactive and will hang in agent environments. To divide a commit, use jj restore to move changes out, then create separate commits manually.

Absorbing Changes

Automatically distribute changes to the commits that last modified those lines:

# Absorb working copy changes into appropriate ancestor commits
jj absorb

Abandoning Commits

Remove a commit entirely (descendants are rebased to its parent):

jj abandon <change-id>

Undoing Operations

Reverse the last jj operation:

jj undo

This reverts the repository to its state before the previous command. Useful for recovering from mistakes like accidental abandon, squash, or rebase.

Restoring Files

Discard changes to specific files or restore files from another revision:

# Discard all uncommitted changes in working copy (restore from parent)
jj restore

# Discard changes to specific files
jj restore path/to/file.txt

# Restore files from a specific revision
jj restore --from <change-id> path/to/file.txt