Conflictos en Jujutsu
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:
- Hacer rebase de 10 commits y resolver conflictos después
- Commitear código con conflictos sin problema
- Resolver conflictos en cualquier orden
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
>>>>>>>
%%%%%%%: Muestra el diff de un lado+++++++: Muestra el contenido completo del otro lado
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ón | Git | jj |
|---|---|---|
| Rebase con conflictos | Para en cada commit | Rebasa todo, resuelves después |
| Merge con conflictos | Bloquea hasta resolver | Commitea con conflictos, resuelves cuando puedas |
| Múltiples conflictos | Uno a uno en orden | En cualquier orden |