Flujos Avanzados Git
Guia interna · Equipo CULTIVA IA · cultivaia/platform
4 devs · Next.js 14 + Supabase
🚨

Situacion del equipo hoy

PRs con historial caótico · Bug aparecio hace ~50 commits · Rama feature/ai-assistant borrada accidentalmente · Dos devs trabajando en paralelo (pagos + onboarding) · Force push sin --force-with-lease sobreescribio trabajo

Tecnicas core
1. Rebase Interactivo
Limpiar historial antes de un PR
pick
Mantener tal cual
reword
Cambiar mensaje
edit
Modificar contenido
squash
Fusionar + mensaje
fixup
Fusionar sin mensaje
drop
Eliminar commit
# Ver los últimos 6 commits (feat/pagos) git rebase -i HEAD~6 # En el editor aparecerá: pick a1b2c3 feat: add Stripe checkout pick d4e5f6 WIP pick g7h8i9 fix typo pick j0k1l2 fix del fix pick m3n4o5 add webhook handler pick p6q7r8 tests # Cambia a: pick a1b2c3 feat: add Stripe checkout fixup d4e5f6 WIP fixup g7h8i9 fix typo fixup j0k1l2 fix del fix pick m3n4o5 feat: add Stripe webhook handler pick p6q7r8 test: Stripe checkout + webhooks
# Rebase sobre main (todos los commits del branch) git rebase -i $(git merge-base HEAD main) # Push tras rebase (SIEMPRE con --force-with-lease) git push --force-with-lease origin feature/pagos
⚠️ Nunca rebases ramas publicas compartidas. Solo usa en ramas propias antes de la PR.
🍒
2. Cherry-Pick
Hotfix rapido entre ramas
1
Localiza el hash del commit con el fix en feature/ai-assistant
2
Cambia a main o hotfix/branch
3
Aplica solo ese commit con cherry-pick
4
Push a produccion y abre PR de hotfix
# Buscar hash del fix en el log git log --oneline feature/ai-assistant # Cherry-pick del commit concreto git cherry-pick c9d8e7f # Cherry-pick sin commit (revisa antes) git cherry-pick -n c9d8e7f git diff --staged # inspecciona git commit -m "hotfix: fix null pointer in AI handler"
# Cherry-pick de un rango (excluye abc123) git cherry-pick abc123..def456 # Editar mensaje al aplicar git cherry-pick -e c9d8e7f # Abortar si hay conflictos git cherry-pick --abort
Ideal para backports: aplicar el mismo fix a v1-stable y v2-dev sin mergear toda la rama.
🔍
3. Git Bisect
Bug aparecio hace ~50 commits
v2.0
good
skip
c25
testing…
c38
bad
HEAD
bad
50 commits → 6 pasos para encontrar el culpable (log₂50 ≈ 6)
# Iniciar bisect git bisect start git bisect bad # HEAD está roto git bisect good v2.0.0 # v2.0 funcionaba bien # Git checkout el commit del medio → prueba la app # Si el bug aparece: git bisect bad # Si la app funciona bien: git bisect good # Repetir hasta: # → "c3d4e5f is the first bad commit" git bisect reset # volver a HEAD
# AUTOMATICO: con script de test git bisect start HEAD v2.0.0 git bisect run ./scripts/check-bug.sh # check-bug.sh: exit 0 = bueno, exit 1 = malo
⚠️ Haz commit o stash antes de bisect. Working directory sucio causa falsos resultados.
🌿
4. Worktrees
Pagos y onboarding en paralelo sin stash
PRINCIPAL
~/cultivaia/platform
🌿 main
Dev A · prod-ready
WORKTREE 1
~/cultivaia/platform-pagos
🌿 feature/stripe-v2
Dev B · Stripe checkout
WORKTREE 2
~/cultivaia/platform-onboarding
🌿 feature/onboarding-v3
Dev C · nuevo flow
# Ver worktrees activos git worktree list # Crear worktree para Stripe (rama existente) git worktree add ../platform-pagos feature/stripe-v2 # Crear worktree + NUEVA rama desde main git worktree add -b feature/onboarding-v3 ../platform-onboarding main # Dev B trabaja en ../platform-pagos normalmente # Dev C trabaja en ../platform-onboarding # Dev A sigue en platform/ (main)
# Hotfix urgente: worktree temporal desde main git worktree add -b hotfix/null-pointer ../platform-hotfix main # ... hacer el fix, commit, push ... # Eliminar worktree cuando termines git worktree remove ../platform-hotfix git worktree prune # limpiar stale
Cada worktree tiene su propio directorio de trabajo pero comparten el repositorio Git. Sin stash, sin branch switching.
🔄
5. Reflog
Recuperar feature/ai-assistant borrada
hashacciondescripcion
f9e8d7c HEAD@{0} checkout: moving to main
a1b2c3d HEAD@{1} branch: deleted feature/ai-assistant
a1b2c3d HEAD@{2} commit: feat: add RAG pipeline
9f8e7d6 HEAD@{3} commit: feat: openai streaming
7c6b5a4 HEAD@{4} commit: init ai-assistant module
# Ver reflog completo git reflog # RECUPERAR la rama borrada # Hash = a1b2c3d (último commit de feature/ai-assistant) git branch feature/ai-assistant a1b2c3d # O directamente hacer checkout git checkout -b feature/ai-assistant a1b2c3d
# Recuperar commit tras reset --hard accidental git reflog # encontrar hash del commit perdido git reset --hard abc123 # volver al punto deseado # Ver reflog de una rama especifica git reflog show feature/ai-assistant # Restaurar archivo a version de commit concreto git restore --source=a1b2c3d src/lib/ai/handler.ts
💡 Reflog guarda TODOS los movimientos de HEAD durante 90 dias. Es tu red de seguridad absoluta.
Mejores Practicas del Equipo
Politica interna CULTIVA IA
Siempre --force-with-lease en vez de --force
Rama backup antes de rebase complejo
Commits atomicos: un cambio logico por commit
Rebase solo en commits locales no compartidos
Stash o commit antes de bisect
Worktrees para features largas en paralelo
# Flujo pre-PR estandar CULTIVA IA git branch backup-feature/pagos # 1. backup git fetch origin # 2. actualizar git rebase -i origin/main # 3. rebase sobre main # ... resolver conflictos si hay ... git push --force-with-lease # 4. push seguro # 5. abrir PR con historial limpio ✓
Errores Comunes y Recuperacion
Lo que ya le paso al equipo
Force push sin lease → sobreescribio trabajo de otro dev
Usar siempre git push --force-with-lease
Rebase de rama publica → conflictos para todos
Rebase solo en ramas propias no compartidas
⚠️
Olvidar limpiar worktrees → disco lleno
git worktree prune al terminar la feature
# EMERGENCIAS: comandos de rescate # Abortar cualquier operacion en curso git rebase --abort git merge --abort git cherry-pick --abort git bisect reset # Deshacer ultimo commit (mantener cambios) git reset --soft HEAD^ # Deshacer ultimo commit (descartar cambios) git reset --hard HEAD^ # Recuperar rama borrada via reflog git reflog # → encontrar hash git branch recovered-branch <hash>