Conflictos en Jujutsu

Por: Artiko
jujutsujjconflictosmerge

Conflictos como ciudadanos de primera clase

En Git, un conflicto bloquea la operación en curso (merge, rebase, cherry-pick) hasta que lo resuelvas. En jj, los conflictos se almacenan en el commit y puedes seguir trabajando.

Esto significa que puedes:

Cómo se ven los conflictos

Cuando hay un conflicto, jj status lo muestra:

Working copy changes:
C archivo.txt  (conflict)

Y jj log marca el commit:

@  sqpuoqvx [email protected] 2026-02-26 conflict
│  mi cambio

Marcadores de conflicto

Los archivos con conflicto usan marcadores similares a Git pero con una diferencia: jj usa formato de 3 vías:

<<<<<<< Conflict 1 of 1
%%%%%%% Changes from base to side #1
-línea original
+cambio del lado 1
+++++++ Contents of side #2
cambio del lado 2
>>>>>>>

Resolver conflictos

Opción 1: Editar el archivo directamente

Abre el archivo, resuelve el conflicto eliminando los marcadores, y guarda. jj detecta que ya no hay marcadores y marca el conflicto como resuelto.

Opción 2: Elegir un lado completo

# Quedarte con los cambios del primer padre
jj restore --from PADRE1 archivo.txt

# Quedarte con los cambios del segundo padre
jj restore --from PADRE2 archivo.txt

Opción 3: Herramienta de merge

jj resolve archivo.txt

Usa la herramienta de merge configurada (meld, kdiff3, etc.).

Configurar herramienta:

jj config set --user merge-tools.meld.program "meld"

Conflictos durante rebase

Cuando haces rebase y hay conflictos, jj no se detiene:

jj rebase -s mi-feature -d main
# Rebased 3 commits, 1 with conflicts

El commit con conflicto queda marcado pero los demás se rebasan normalmente. Puedes resolverlo cuando quieras:

# Ir al commit con conflicto
jj edit sqpuoqvx

# Resolver
jj resolve archivo.txt

# Volver a trabajar
jj new

Ver qué commits tienen conflictos

jj log -r "conflicts()"

Ejemplo práctico

# Tienes cambios en main y en tu feature que tocan el mismo archivo
jj rebase -s mi-feature -d main
# 1 commit tiene conflictos

# Ves cuál es
jj log -r "conflicts()"

# Lo editas
jj edit sqpuoqvx

# Resuelves el archivo
jj resolve config.js

# Vuelves a la punta
jj new
# Los descendientes se rebasan automáticamente sin conflictos

Ventajas sobre Git

SituaciónGitjj
Rebase con conflictosPara en cada commitRebasa todo, resuelves después
Merge con conflictosBloquea hasta resolverCommitea con conflictos, resuelves cuando puedas
Múltiples conflictosUno a uno en ordenEn cualquier orden