Flujos de trabajo avanzados
Operation Log: tu red de seguridad
Cada operación en jj se registra en un log inmutable. Esto te permite deshacer cualquier acción:
# Ver el log de operaciones
jj op log
Salida:
@ abc123 2026-02-26 10:30 describe commit sqpuoqvx
○ def456 2026-02-26 10:28 new empty commit
○ ghi789 2026-02-26 10:25 fetch from git remote(s) origin
Deshacer la última operación
jj undo
Volver a un punto específico
jj op restore abc123
Esto es más poderoso que git reflog porque restaura el estado completo del repositorio, no solo las referencias.
Trabajar en múltiples cosas a la vez
Cambiar entre cambios en progreso
# Tienes varios commits sin terminar
jj log
# ○ aaa "feat: login (WIP)"
# │ ○ bbb "fix: bug en navbar"
# ├─╯
# ○ main
# Ir a trabajar en el login
jj edit aaa
# Cambiar al bug
jj edit bbb
# Crear algo nuevo desde main
jj new main
No necesitas stash ni branches — cada trabajo en progreso es simplemente un commit.
Trabajar en paralelo
# Feature A desde main
jj new main
jj describe -m "feat A: parte 1"
jj new
jj describe -m "feat A: parte 2"
# Feature B desde main (independiente)
jj new main
jj describe -m "feat B: inicio"
Absorb: distribuir cambios automáticamente
Si tienes cambios en el working copy que deberían ir a commits anteriores:
jj absorb
jj analiza qué líneas cambiaste y las distribuye automáticamente al commit que introdujo esas líneas originalmente.
Duplicate: copiar commits
# Duplicar un commit
jj duplicate sqpuoqvx
# Duplicar una cadena de commits
jj duplicate -r "main..feature"
Templates personalizados para el log
Personaliza cómo se muestra jj log:
# Log compacto
jj log -T 'change_id.short() ++ " " ++ description.first_line() ++ "\n"'
Configura el template por defecto en ~/.jjconfig.toml:
[templates]
log = 'change_id.short() ++ " " ++ description.first_line() ++ "\n"'
Aliases
Define atajos en tu configuración:
[aliases]
l = ["log", "-r", "ancestors(@, 10)"]
d = ["diff"]
s = ["status"]
n = ["new"]
p = ["git", "push"]
f = ["git", "fetch"]
Uso:
jj l # log de últimos 10 ancestros
jj d # diff
jj s # status
Workflow para code review
# 1. Preparar commits atómicos
jj split -r sqpuoqvx # dividir commits grandes
jj squash # combinar commits pequeños
# 2. Reordenar commits
jj rebase -r fix-commit -d feature-base
# 3. Limpiar mensajes
jj describe -r sqpuoqvx -m "feat: descripción clara"
# 4. Push
jj bookmark set mi-pr
jj git push --bookmark mi-pr
Resolución de problemas comunes
”Divergent change” después de push + amend
# Si editaste un commit que ya estaba en el remoto
jj git push --bookmark mi-feature
# Error: bookmark already points to...
# Forzar (con cuidado):
jj git push --bookmark mi-feature --allow-new
Working copy sucio al cambiar de tarea
No pasa en jj. Tu working copy ES un commit. Solo haz jj new DESTINO para ir a otro lado.
Recuperar trabajo perdido
# Ver operaciones recientes
jj op log
# Restaurar estado anterior
jj op restore ID_OPERACION
Cheatsheet final
# Básicos
jj new # nuevo commit
jj describe -m "" # describir commit
jj diff # ver cambios
jj log # ver historial
jj status # estado actual
# Edición
jj squash # combinar con padre
jj split # dividir commit
jj edit REV # editar commit pasado
jj rebase -s A -d B # mover commits
jj abandon REV # eliminar commit
# Git
jj git fetch # traer cambios
jj git push # enviar cambios
jj bookmark create # crear referencia
# Seguridad
jj undo # deshacer última operación
jj op log # ver historial de operaciones
jj op restore ID # restaurar punto anterior