Integración con Git

Por: Artiko
jujutsujjgitintegracion

Modos de integración con Git

jj puede trabajar con Git de dos formas:

1. Repositorio colocado (recomendado)

El directorio .git y .jj coexisten. Puedes usar jj y git en el mismo repo:

# Desde un repo Git existente
cd mi-repo-git
jj git init --colocate

2. Repositorio con backend Git

jj gestiona el backend Git internamente:

jj git init mi-repo

El .git existe pero está gestionado por jj. No deberías usar git directamente.

Workflow colocado

Este es el modo más común. Tu equipo usa Git, tú usas jj:

# Clonar
jj git clone https://github.com/org/repo.git
cd repo

# Fetch cambios
jj git fetch

# Tu flujo normal con jj
jj new main
# ... trabajas ...
jj describe -m "feat: nueva feature"
jj bookmark create mi-feature

# Push
jj git push --bookmark mi-feature

Tus compañeros nunca saben que usas jj — ven commits Git normales.

Sincronización Git ↔ jj

Importar cambios de Git

jj git fetch

Esto trae los cambios remotos y actualiza los bookmarks de tracking.

Exportar cambios a Git

jj git push --bookmark mi-feature

Importar cambios locales de Git

Si alguien (o un IDE) hizo cambios con git directamente:

jj git import

Exportar estado de jj a Git

jj git export

Trabajar con remotos

Agregar un remoto

jj git remote add upstream https://github.com/org/repo.git

Listar remotos

jj git remote list

Fetch de un remoto específico

jj git fetch --remote upstream

Pull requests / Merge requests

El flujo para PRs es idéntico a Git:

# 1. Actualizar main
jj git fetch

# 2. Crear tu feature desde main
jj new main
echo "código nuevo" > feature.js
jj describe -m "feat: nueva funcionalidad"

# 3. Más commits si necesitas
jj new
echo "tests" > feature.test.js
jj describe -m "test: agregar tests"

# 4. Crear bookmark y push
jj bookmark create feat-nueva-funcionalidad
jj git push --bookmark feat-nueva-funcionalidad

# 5. Crear PR en GitHub/GitLab normalmente

Actualizar PR con cambios de main

jj git fetch
jj rebase -s feat-nueva-funcionalidad -d main
jj git push --bookmark feat-nueva-funcionalidad

Mapeo de conceptos Git ↔ jj

Gitjj
git clonejj git clone
git fetchjj git fetch
git pushjj git push
git branchjj bookmark
git checkoutjj new REV
git stashNo necesario (working copy es commit)
git add + commitjj describe (ya es commit)
git logjj log
git diffjj diff
git rebase -ijj squash, jj split, jj edit

Limitaciones del modo colocado