# Rebases

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvByckxfTllpRqfkk%2Frebase1.png?generation=1568131568737990\&alt=media)

La ilustración describe un escenario para el comando **rebase.**

Hay dos maneras de poner las dos ramas juntas, la primera es la que ya conocemos como merge que situados en la rama **spaghetti** podríamos dar el comando:

```
git merge master
```

y obtendríamos:

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBye96t8PbEtR1H_%2Frebase2.png?generation=1568131568520547\&alt=media)

Los parent de este nuevo commit (rosado) serian los últimos de cada rama.

La otra manera de juntar los branch es con **rebase,** este comando en primera instancia busca el primer commit en común entre los dos branch (commit rojo en nuestro ejemplo), toda la historia antes de este commit ya esta compartida.

Seguidamente git ubica los commit de la actual rama sobre la rama que se le esta haciendo rebase:

```
git rebase master
```

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvByg2wnQOp0aecH0%2Frebase3.png?generation=1568131568369306\&alt=media)

Al igual que el merge habría que resolver los conflictos si los hay, ahora el branch spaghetti branch contiene los commit propios y ademas los de el branch master. Si seguidamente se hace rebase de forma invertida git detecta la anterior acción y lo único que hace es pasar al Head el branch master:

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvByidJo4-ZgSh5Ln%2Frebse4.png?generation=1568131568456764\&alt=media)

A diferencia del merge, terminado el rebase se visualiza como un simple branch :

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBykVb2IskUPggvR%2Frebase5.png?generation=1568131570841212\&alt=media)

## Diferentes ventajas y desventajas

### Merge

* Preserva la historia del proyecto
* Las historia con muchos merge puede ser confusa de leer
* El merge nunca miente

### Rebase

* El proyecto luce mas ágil y limpio&#x20;
* La historia limpia que muestra no es tan real, por lo que los commit que se "monta" de un branch a otro son nuevos commit (copias de los originales, que se quedan sin branch y el garbage collector puede eliminar), realmente cambia las historia del proyecto.
* Algunos comandos avanzados de git le pueden importar la historia real del proyecto
* Puede que se presenten situaciones confusas como el mismo mensaje en diferentes commits

Rebase es un comando útil si se sabe que se está haciendo y se conocen las consecuencias, pero si tiene dudas es mejor utilizar el merge.
