Merge y rebase. Rebase de forma segura. No emplear si la rama está siendo utilizada por varios desarrolladores.
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