Edición del historial

Por: Artiko
jujutsujjhistorialrebasesquash

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

ComandoDescripción
jj squashCombinar con el padre
jj splitDividir commit en dos
jj edit REVEditar commit anterior
jj rebase -r REV -d DESTMover un commit
jj rebase -s REV -d DESTMover commit + descendientes
jj abandon REVEliminar commit
jj describe -r REV -m "msg"Cambiar mensaje