Rebase de forma segura. No emplear si la rama está siendo utilizada por varios desarrolladores puesto que puede sobreescribir los cambios sin avisar de conflictos produciendo comportamientos indeseados.
Realizamos un rebase de una rama diferente a master.
Nos movemos a nuestra rama en la que desarrollamos las nuevas características.
git checkout feature
Creamos una nueva rama para evitar problemas con los posibles conflictos
git checkout -b temporary-branch
Pasamos los cambios de master a la nueva rama temporal con un rebase interactivo. De esta forma podremos rehacer los commits, cambiar sus mensajes, unirlos con squash, etc.
Así limpiamos el historial.
git rebase -i master
Una vez arreglados los comflictos y si todo ha ido bien nos pasamos a master y hacemos un merge de la rama temporal.
Recordemos que si la rama a la que queremos hacer el rebase es usada por varias personas es mejor emplear merge, es más seguro y deja una prueba de que se realizó dicho merge).
git checkout master
git merge temporary-branch
Eliminamos rama temporal y rama de funcionalidad en local (si es necesario).
git branch -d temporary-branch
# Solo si es necesario
git branch -d feature
Eliminamos la rama feature si estaba pusheada en remoto.
git push origin --delete feature