Claude-skill-registry jj:squash

Squash changes from working copy into relevant ancestor commits

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/jj-squash-jbott-nix-config" ~/.claude/skills/majiayu000-claude-skill-registry-jj-squash && rm -rf "$T"
manifest: skills/data/jj-squash-jbott-nix-config/SKILL.md
source content

Squash Changes Into Ancestors

Move changes from the current working copy into appropriate ancestor commits.

Process

  1. Run
    jj diff --summary
    and
    jj diff --stat
    for overview
  2. Run
    jj log -r ::@- --limit 15
    to see candidate ancestor commits
  3. Analyze changes:
    • Small (≤5 files, ≤200 lines): run
      jj diff
      directly
    • Large: use
      /jj-context
      for structured summary
  4. Match changes to commits by path and commit descriptions
  5. Execute squashes

Basic Usage

Without options,

jj squash
moves all changes from
@
into its parent:

jj squash  # squash @ into @-

Whole Files

jj squash --into <change-id> path/to/file.py   # -t is short for --into
jj squash --into <change-id> "src/**/*.py"     # glob pattern
jj squash --into @--                            # into grandparent

Sub-File Chunks

For extracting specific hunks (not whole files):

  1. Save original @ change ID:

    jj log -r @ --no-graph -T 'change_id'
    
  2. Create intermediate commit:

    jj new --insert-before @
    
  3. Write only the hunks for target commit (use Edit tool)

  4. Squash into target:

    jj squash --into <target-change-id>
    
  5. Return to rebased @ and remove duplicated hunks:

    jj edit <rebased-@-change-id>
    
  6. Restore working copy:

    jj new
    

Notes

  • Always use change IDs (e.g.,
    ksrmwuon
    ) not commit IDs - they're stable across rewrites
  • After squashing, @ remains as working copy (empty if all changes moved)