Integración con Git
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
| Git | jj |
|---|---|
git clone | jj git clone |
git fetch | jj git fetch |
git push | jj git push |
git branch | jj bookmark |
git checkout | jj new REV |
git stash | No necesario (working copy es commit) |
git add + commit | jj describe (ya es commit) |
git log | jj log |
git diff | jj diff |
git rebase -i | jj squash, jj split, jj edit |
Limitaciones del modo colocado
- No uses
git rebaseogit commit --amendmientras jj está activo - Los hooks de Git funcionan parcialmente
- Submodules Git no están completamente soportados
- Si haces cambios con
git, ejecutajj git importdespués