git rebase
git rebase: reaplica commits de una rama encima de otra rama.
El comando git rebase se usa para mover o combinar una secuencia de commits sobre un nuevo commit base. A diferencia de git merge, que crea un commit de fusión para combinar dos ramas, el rebase toma los commits de tu rama actual y los vuelve a aplicar encima de otra rama, creando un historial de commits lineal.
Hacer rebase es especialmente útil para mantener un historial de proyecto limpio y lineal. En vez de crear una "ensalada de commits" donde los commits de ramas distintas quedan intercalados, el rebase hace que tus commits de funcionalidad parezcan desarrollados directamente encima de los últimos cambios de la rama de destino.
Hay dos tipos principales de rebase:
-
Rebase normal (predeterminado):
- Busca un commit ancestro común entre tu rama actual y la rama de destino.
- Guarda temporalmente los commits que solo existen en tu rama actual.
- Mueve el puntero de tu rama actual al último commit de la rama de destino.
- Reaplica, uno a uno, los commits guardados encima del último commit de la rama de destino.
En la práctica, esto hace que parezca que empezaste tu rama desde el último commit de la rama de destino, en lugar de hacerlo desde aquel commit antiguo donde creaste la rama originalmente.
-
Rebase interactivo (
git rebase -i): Te muestra una interfaz donde puedes editar, reordenar, combinar con squash o eliminar commits durante el proceso de rebase. Probablemente, la función más potente de Git.
Hacer rebase reescribe el historial de commits creando commits nuevos con los mismos cambios, pero con hashes de commit distintos. Esto significa que nunca deberías hacer rebase de commits que ya has compartido con otras personas, porque puede causar confusión y conflictos a quienes colaboran contigo.
Traer cambios con rebase
Por defecto, ejecutar git pull equivale básicamente a combinar git fetch seguido de git merge. El paso de fusión puede crear un commit de fusión inútil en la rama actual. Hazlo varias veces mientras desarrollas una funcionalidad y acabarás con un historial de commits desordenado, lo que hará que la fusión final sea especialmente incómoda.
Lo que realmente quieres es tomar los últimos cambios de la rama remota y poner todos tus commits recientes encima. Puedes conseguirlo con git pull --rebase.
Pero añadir esa opción cada vez es tedioso, así que puedes usar git config para hacer que git pull use git rebase por defecto:
git config pull.rebase trueEjemplos
(útil cuando estás en una rama de funcionalidad u otra rama) Hacer rebase de la rama actual sobre main:
git rebase mainIniciar un rebase interactivo de los 3 últimos commits, por ejemplo, para reordenarlos o combinarlos con squash en un solo commit:
git rebase -i HEAD~3Continuar un rebase después de resolver conflictos de fusión:
git add .git rebase --continue
Abortar un rebase y volver al estado original:
git rebase --abortActualizar tu rama actual con los últimos cambios de main, tomando la rama main y poniendo todos tus commits encima:
git fetch origingit rebase origin/main
Definir rebase como comportamiento predeterminado de git pull:
git config pull.rebase true.gitignoregit checkoutgit configgit taggit worktree