Edición del historial
Editar el historial es natural en jj
A diferencia de Git donde editar el historial es “peligroso”, en jj es una operación cotidiana. Los descendientes se actualizan automáticamente y siempre puedes deshacer con jj undo.
Squash: combinar commits
Combina el commit actual con su padre:
# Squash del working copy hacia su padre
jj squash
# Squash de un commit específico hacia su padre
jj squash -r sqpuoqvx
# Squash solo ciertos archivos
jj squash archivo.js
Squash interactivo
# Abre un editor para seleccionar qué cambios combinar
jj squash -i
Split: dividir un commit
Divide un commit en dos o más:
# Split interactivo del working copy
jj split
# Split de un commit específico
jj split -r sqpuoqvx
Se abre un editor donde seleccionas qué cambios van en el primer commit. El resto queda en un segundo commit.
Edit: modificar un commit anterior
jj edit sqpuoqvx
Esto mueve tu working copy al commit indicado. Haces tus cambios y automáticamente se aplican a ese commit. Los descendientes se rebasan automáticamente.
Para volver a trabajar en la punta:
jj new # crear nuevo commit al final
Rebase: mover commits
Mover un commit sobre otro destino
# Mover commit sqpuoqvx sobre main
jj rebase -r sqpuoqvx -d main
Mover un commit y todos sus descendientes
jj rebase -s sqpuoqvx -d main
Mover solo un commit (sacándolo de la cadena)
jj rebase -r sqpuoqvx -d main
Con -r, los hijos del commit rebaseado se reconectan al padre original.
Abandon: eliminar un commit
# Eliminar un commit (los hijos se reconectan al padre)
jj abandon sqpuoqvx
No se pierden datos — el commit se vuelve oculto pero sigue en el log de operaciones.
Describe: cambiar el mensaje
jj describe -r sqpuoqvx -m "nuevo mensaje"
Rebase automático de descendientes
Esta es una de las mejores características de jj. Cuando editas cualquier commit:
Antes: Después de editar B:
A → B → C → D A → B' → C' → D'
Los commits C y D se rebasan automáticamente sobre la nueva versión de B. No necesitas hacer nada extra.
Ejemplo práctico
# Tienes 3 commits
jj log
# @ xyz (vacío - working copy)
# ○ ccc "agregar tests"
# ○ bbb "agregar feature"
# ○ aaa "setup inicial"
# Quieres agregar algo al commit de feature (bbb)
jj edit bbb
echo "más código" >> feature.js
jj describe -m "agregar feature completa"
# Volver a la punta
jj new
# Los tests (ccc) ya se rebasearon automáticamente
Resumen de comandos
| Comando | Descripción |
|---|---|
jj squash | Combinar con el padre |
jj split | Dividir commit en dos |
jj edit REV | Editar commit anterior |
jj rebase -r REV -d DEST | Mover un commit |
jj rebase -s REV -d DEST | Mover commit + descendientes |
jj abandon REV | Eliminar commit |
jj describe -r REV -m "msg" | Cambiar mensaje |