Ir al contenido

Jujutsu (jj) - Control de Versiones Compatible con Git

Jujutsu (jj) - Control de Versiones Compatible con Git

Jujutsu (jj) es un sistema de control de versiones moderno que es compatible con Git — utiliza un repositorio Git como backend, por lo que puedes adoptarlo en repositorios existentes e interoperar con compañeros que usan Git. Su modelo es diferente y, para muchos, más simple: la copia de trabajo es en sí misma un commit (sin área de staging separada), los conflictos son objetos de primera clase que puedes confirmar y resolver más tarde, y cada operación se registra en un registro de operaciones que puedes deshacer. No hay ramas en el sentido de Git por defecto; trabajas con cambios identificados por IDs de cambio estables.

Instalación

PlataformaComando
Cargocargo install --locked jj-cli
macOS (Homebrew)brew install jj
Arch Linuxsudo pacman -S jujutsu
Nixnix profile install nixpkgs#jujutsu
Windows (Scoop)scoop install jujutsu
Verificarjj --version

Configuración

ComandoDescripción
jj config set --user user.name "Your Name"Establecer tu nombre
jj config set --user user.email "you@example.com"Establecer tu correo
jj git init --colocateInicializar jj en un repositorio Git existente (mantiene .git)
jj git clone <url>Clonar un repositorio Git con jj
jj git initCrear un nuevo repositorio jj (backend nativo)

Conceptos Fundamentales

TérminoSignificado
ChangeUn cambio lógico con un ID de cambio estable (sobrevive reescrituras)
CommitUna captura de pantalla; la copia de trabajo siempre es un commit (@)
@El commit de copia de trabajo actual
RevsetUn lenguaje de consulta para seleccionar commits
Operation logHistorial de operaciones del repositorio, cada una reversible
BookmarkUn puntero con nombre (se asigna a una rama Git al hacer push)

Flujo de Trabajo Cotidiano

ComandoDescripción
jj statusMostrar cambios de copia de trabajo
jj logMostrar el gráfico de commits
jj diffDiferencia del commit de copia de trabajo
jj describe -m "msg"Establecer/reemplazar el mensaje del commit actual
jj newIniciar un nuevo cambio encima del actual
jj new <rev>Iniciar un nuevo cambio encima de un commit específico
jj edit <rev>Convertir un commit existente en la copia de trabajo
jj commit -m "msg"Describir @ e iniciar un nuevo cambio (estilo Git)

Movimiento y Edición del Historial

ComandoDescripción
jj squashMover cambios de @ a su padre
jj squash -iElegir interactivamente qué comprimir
jj splitDividir el commit actual en dos
jj rebase -d <dest>Hacer rebase de un cambio a un destino
jj abandon <rev>Descartar un commit
jj duplicate <rev>Copiar un commit a otro lugar

La Característica Asesina: Deshacer

ComandoDescripción
jj op logListar cada operación realizada
jj undoDeshacer la última operación
jj op restore <id>Restaurar el repositorio a un estado de operación anterior

Dado que cada comando es una operación, casi cualquier cosa puede deshacerse — incluyendo rebases y descartes.

Bookmarks e Interoperabilidad con Git

ComandoDescripción
jj bookmark create main -r @Crear un bookmark (≈ rama Git)
jj bookmark set main -r @Mover un bookmark a un commit
jj git fetchTraer desde el repositorio remoto Git
jj git pushEmpujar bookmarks al repositorio remoto Git
jj git push -c @Crear una rama remota a partir del cambio actual

Revsets (Seleccionando Commits)

RevsetSelecciona
@Commit de copia de trabajo
@-Padre de la copia de trabajo
mainEl commit al que apunta un bookmark
mine()Tus commits
ancestors(@)Todos los ancestros de @
jj log -r "description(glob:'fix*')"Commits cuyo mensaje coincide

Flujos de Trabajo Comunes

# Adoptar jj en un repositorio Git existente, seguir trabajando con remotos Git
jj git init --colocate
jj log

# Hacer un cambio sin staging — simplemente editar archivos, luego describir
# (los archivos se capturan automáticamente en @)
jj describe -m "Add feature"
jj new                       # iniciar el siguiente cambio

# Oops — deshacer lo último que hiciste (incluso un rebase)
jj undo

# Empujar el cambio actual como una rama para revisión
jj bookmark create feature -r @
jj git push -c @

jj vs Git

AspectoJujutsu (jj)Git
Área de stagingNinguna (la copia de trabajo es un commit)Index/staging
ConflictosDe primera clase, pueden confirmarseDeben resolverse antes de continuar
DeshacerUniversal vía op logReflog (parcial)
RamasBookmarks (opcional)Ramas (central)
BackendCompatible con GitGit

Recursos