Flujos de trabajo avanzados

Por: Artiko
jujutsujjavanzadoworkflow

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