Replantear la base

Despegar commits y re-aplicarlos sobre la punta de main

git rebase ofrece un enfoque alternativo a git merge: en vez de crear un commit de unión, "despega" tus commits locales, mueve la base de tu rama hasta la punta de main y vuelve a aplicar (replay) tus cambios uno a uno con nuevos hashes.

Observa cómo los commits D y E se despegan y se apilan sobre C.
Estado: Ramas divergentes (antes del rebase)
main: A → B → C (tip de main)
feature: A → B ──┐ (fork)
└──→ D → E
Decisiones arquitectónicas

Merge vs Rebase: Criterio técnico y tradeoffs

Ninguna herramienta es superior en abstracto: ambas resuelven problemas distintos. Conoce los tradeoffs reales para elegir con madurez según las políticas de tu equipo.

git merge

Fusión Histórica

  • ✓ Preserva la cronología exacta y la verdad histórica
  • ✓ Nunca reescribe hashes SHA existentes (seguro)
  • ✕ Crea commits de fusión redundantes ("Merge branch...")
  • ✕ El grafo de ramas se vuelve un laberinto en equipos grandes
Cuándo usar:

Para integrar Pull Requests completados en main y preservar contexto de equipo.

git rebase

Autopista Lineal

  • ✓ Historial perfectamente lineal, legible y estético
  • ✓ Facilita enormemente git bisect para cazar bugs
  • ✕ Reescribe los hashes SHA de los commits
  • ✕ Peligroso si se aplica sobre ramas compartidas públicas
Cuándo usar:

En ramas locales privadas antes de abrir PR para mantenerlas actualizadas con main.

Seguridad de equipo

La Regla de Oro: NUNCA hagas rebase en ramas públicas

Reescribir la historia de una rama en la que otros desarrolladores están trabajando obliga a todo el equipo a descartar sus árboles y reconstruir sus ramas manualmente. Romper esta regla destruye la confianza técnica.

🟢

Caso Seguro: Tu rama privada local

Estás trabajando en feat/mi-tarea en tu PC. Nadie más tiene esa rama. Hacer git rebase main es 100% seguro, profesional y recomendado.

git switch feat/mi-tarea
git rebase main
🛑

Caso Prohibido: Ramas públicas (main / develop)

Hacer rebase en main y forzar el push con git push --force sobreescribe el árbol del servidor. Los commits de tus compañeros quedan huérfanos y desincronizados.

git push --force origin main # ✕ ¡NUNCA HAGAS ESTO!
Resolución commit por commit

Conflictos en Rebase: ¡Aquí NO se usa git commit!

El error más frecuente de los juniors: al resolver un conflicto durante un rebase, ejecutan git commit y arruinan la secuencia. En un rebase, tras editar y hacer git add, se continúa con git rebase --continue.

1
Git frena en el commit en conflicto

Aparece el aviso: "Resolve all conflicts manually, mark them as resolved with git add...".

2
Editar archivo y resolver marcadores

Borra <<<<<<<, =======, >>>>>>> y deja el código probado y funcional.

3
git add <archivo>

Indexa el archivo corregido en el Staging Area.

4
git rebase --continue

¡NO ejecutes git commit! Esta instrucción le indica a Git que aplique el commit actual y prosiga con el siguiente.

🛟 ¿Algo salió mal? Vuelve al estado intacto anterior con: git rebase --abort
Semántica de commits

Commits atómicos y la especificación Conventional Commits

Un repositorio profesional se distingue por la claridad de su historial. La especificación Conventional Commits estandariza prefijos semánticos para habilitar changelogs automáticos y versionado semántico.

Construye tu mensaje estandarizado:
Vista previa del commit:
feat(auth): validate JWT bearer token expiration

✓ feat dispara una versión MINOR en SemVer (0.1.0 -> 0.2.0)

Higiene del repositorio

Gestión rigurosa de .gitignore y git rm --cached

Nunca subas archivos de dependencias, artefactos compilados ni variables de entorno con secretos. Si ya cometiste el error de agregar un archivo sensible, git rm --cached te permite quitarlo del índice sin borrarlo de tu disco.

Estructura estándar de .gitignore
# Dependencias
node_modules/
vendor/

# Variables de entorno y secretos
.env
.env.local
*.pem

# Compilación y builds
dist/
build/
*.class

# Archivos del sistema y del editor
.DS_Store
.idea/
.vscode/
El truco técnico: git rm --cached

Si agregaste .env a .gitignore pero Git lo sigue rastreando, es porque ya estaba commiteado antes. Para dejar de rastrearlo sin borrar tu archivo local en disco:

git rm --cached .env
git commit -m "chore: stop tracking .env secret"

💡 El archivo permanecerá intacto en tu computadora pero desaparecerá del repositorio público.