Back

Git Rebase para Principiantes: Una Introducción Simple

Git Rebase para Principiantes: Una Introducción Simple

Si alguna vez has mirado tu historial de Git y has pensado “esto es un desastre”, no estás solo. Esas líneas de ramas enredadas y commits de merge redundantes hacen difícil entender qué cambió realmente y cuándo. Aquí es donde entra git rebase—una herramienta poderosa que te ayuda a mantener un historial de commits limpio y legible.

En esta guía, aprenderás qué hace el rebasing, cómo difiere del merging, y cuándo usarlo en tu flujo de trabajo diario. Nos enfocaremos en ejemplos prácticos que puedes comenzar a usar hoy, mientras destacamos las trampas clave que debes evitar.

Puntos Clave

  • Git rebase reproduce commits encima de otra rama, creando un historial lineal
  • Usa rebase para mantener las ramas de características actualizadas y limpiar commits antes de compartirlos
  • Nunca hagas rebase de ramas en las que otros están trabajando
  • El rebase interactivo te permite combinar, reordenar y editar commits
  • Usa force push con --force-with-lease por seguridad después del rebasing

¿Qué es Git Rebase?

Piensa en git rebase como reescribir la historia—pero de una manera buena. Cuando haces rebase, estás tomando commits de una rama y reproduciéndolos encima de otra rama, como si hubieras comenzado tu trabajo desde un punto diferente.

Imagina que estás escribiendo una historia. Comienzas el capítulo 3 mientras tu colega aún está editando el capítulo 2. Cuando terminen, podrías:

  • Hacer merge: Agregar una nota diciendo “inserté los cambios del capítulo 2 de mi colega aquí”
  • Hacer rebase: Reescribir tu capítulo 3 como si lo hubieras comenzado después de que el capítulo 2 ya estuviera completo

El enfoque de rebase te da una narrativa más limpia sin el “ruido del merge”.

¿Por Qué Usar Git Rebase?

Mantener el Historial Lineal y Limpio

Un historial lineal se lee como un libro—un commit sigue a otro en una secuencia clara. Esto hace más fácil:

  • Rastrear cuándo se introdujeron bugs
  • Entender la evolución de las características
  • Revisar cambios de código en pull requests

Sin rebasing, tu historial se llena de commits de merge que dicen “Merged branch ‘main’ into feature-xyz” repetidamente, oscureciendo el trabajo real que se está haciendo.

Cuándo los Desarrolladores Eligen Rebase

Los desarrolladores recurren al rebase en dos situaciones principales:

  1. Mantenerse actualizado: Tu rama de características necesita las últimas actualizaciones de main
  2. Pulir el trabajo: Quieres limpiar commits antes de que otros los revisen

Ambos escenarios ayudan a mantener ese historial limpio y lineal que hace la vida más fácil para todos.

Git Rebase vs Merge: Las Diferencias Clave

Aquí está la diferencia fundamental:

Merge crea un nuevo commit que combina dos ramas:

A---B---C (main)
     \   \
      D---E---M (your-feature)

Rebase reproduce tus commits encima de la rama objetivo:

A---B---C (main)
         \
          D'---E' (your-feature)

Nota cómo rebase crea nuevos commits (D’ y E’) mientras que merge agrega un commit de merge (M). El resultado del rebase es lineal y limpio, mientras que merge preserva el historial exacto pero agrega complejidad.

Casos de Uso Comunes para Git Rebase

Actualizar Tu Rama de Características

Estás trabajando en una característica mientras tu equipo hace push de actualizaciones a main. Para incorporar sus cambios:

git checkout your-feature-branch
git rebase main

Esto reproduce tus commits encima del último main, manteniendo tu rama actualizada sin commits de merge.

Limpiar Commits Antes de un Pull Request

Antes de compartir tu trabajo, podrías querer ordenar tus commits. El rebase interactivo te permite:

git rebase -i HEAD~3

Esto abre un editor donde puedes:

  • Combinar múltiples commits de “trabajo en progreso” en uno
  • Reordenar commits para un flujo lógico
  • Editar mensajes de commit para mayor claridad

Por ejemplo, convertir esto:

- Fix typo
- WIP: add login
- More login stuff
- Fix tests

En esto:

- Add user login functionality with tests

Advertencias Importantes: Cuándo NO Hacer Rebase

La Regla de Oro: No Hagas Rebase de Ramas Compartidas

Nunca hagas rebase de ramas en las que otros están trabajando. Cuando haces rebase, estás creando nuevos commits con diferentes hashes SHA-1. Si alguien más tiene los commits antiguos, Git se confunde y crea commits duplicados.

Seguro hacer rebase: Tu rama de características local
Nunca hacer rebase: main, develop, o cualquier rama que otros usen

Entender los Riesgos del Force Push

Después del rebasing, a menudo necesitarás hacer force push:

git push --force-with-lease origin your-feature-branch

La bandera --force-with-lease es más segura que --force porque verifica que nadie más haya hecho push de cambios desde tu último pull. Aún así, solo hagas force push de ramas que poseas.

Comenzando con Git Rebase

Aquí tienes un flujo de trabajo simple para practicar:

  1. Crea una rama de características desde main
  2. Haz algunos commits
  3. Mientras tanto, main se actualiza
  4. Haz rebase de tu rama de características:
    git checkout feature-branch
    git rebase main
  5. Si ocurren conflictos, resuélvelos y continúa:
    git add .
    git rebase --continue

Comienza con tus ramas locales para ganar confianza antes de hacer rebase de algo compartido.

Conclusión

Git rebase es una herramienta poderosa para mantener historiales de commits limpios y lineales. Al reproducir commits en lugar de hacer merge, creas un historial de proyecto más legible que beneficia a todo tu equipo. Recuerda la regla de oro—solo haz rebase de ramas que no hayas hecho push o que otros no estén usando—y evitarás las trampas comunes.

Comienza a practicar con tus ramas de características hoy. Una vez que experimentes la claridad de un historial lineal, te preguntarás cómo trabajabas sin él.

Preguntas Frecuentes

Sí, puedes usar git reflog para encontrar el hash del commit antes del rebase y luego usar git reset --hard para volver a ese estado. Git mantiene un historial local de dónde ha apuntado HEAD, así que puedes recuperarte de la mayoría de errores.

Git pull realiza un fetch seguido de un merge, creando un commit de merge. Git pull --rebase realiza un fetch seguido de un rebase, reproduciendo tus commits locales encima de la rama remota para un historial más limpio.

No, ambos tienen su lugar. Usa rebase para limpieza local y mantener las ramas de características actualizadas. Usa merge para combinar características terminadas en ramas main donde preservar el historial completo importa.

Ejecuta git rebase --abort para detener el rebase y devolver tu rama a su estado original antes de que comenzara el rebase. Esto funciona cuando estás en medio de resolver conflictos o en cualquier punto durante un rebase interactivo.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay