Um dos problemas que podemos encontrar quando vamos executar um rebase
de commits numa branch do projeto é que ele ignora os commits de merge que foram executados anteriormente no histórico. Fica mais fácil de entender com um exemplo. Vamos considerar o log abaixo:
$ git log
4d09232 Merge remote-tracking branch 'origin/react_hooks' into fix-links [Benjamin Button]
2a09b35 Removes the docs path from the url [Benjamin Button]
7ab1154 add talks [Benjamin Button]
Ao iniciarmos o processo de rebase
desses commits com git rebase -i HEAD~3
:
pick 7ab1154 add talks
pick 2a09b35 Removes the docs path from the url
pick d067764 create hooks # commit do merge
pick 14f28d7 WIP other hooks # commit do merge
pick 1f159b7 Add useRef # commit do merge
pick 1e29013 Corrections based on comments # commit do merge
Note como os commits que compõem o commit de merge são apresentados como opções para reorganização. Agora se quisermos preservar o comit de merge, podemos usar a opção --rebase-merges
: git rebase -i HEAD~3 --rebase-merges
:
pick 7ab1154 add talks
pick 2a09b35 Removes the docs path from the url
pick 4d09232 Merge remote-tracking branch 'origin/react_hooks' into fix-links
A opção --rebase-merges
foi introduzida na versão 2.18 do Git e substitui a antiga --preserve-merges
, que foi descontinuada na versão 2.22.