Tecnicas core
1. Rebase Interactivo
Limpiar historial antes de un PR
Operaciones disponibles
pick
Mantener tal cual
reword
Cambiar mensaje
edit
Modificar contenido
squash
Fusionar + mensaje
fixup
Fusionar sin mensaje
drop
Eliminar commit
Caso real: PR de pagos con historial sucio
# 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
Caso: bug critico en prod, fix en feature branch
1
Localiza el hash del commit con el fix en
feature/ai-assistant2
Cambia a
main o hotfix/branch3
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
Busqueda binaria automatica
v2.0
good
→
c12
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
Estado actual del equipo
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
Historial de movimientos (reflog)
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
Usar siempre
git push --force-with-lease
Rebase de rama publica → conflictos para todos
Rebase solo en ramas propias no compartidas
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>