Prenons le cas suivant :
J'ai travaillé sur une branche topic et je suis maintenant prêt à fusionner vers master :
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
J'effectue la fusion depuis master, je résous les conflits et j'ai maintenant.. :
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
Maintenant, la fusion m'a pris un certain temps, donc je fais un autre fetch et je remarque que la branche master distante a de nouveaux changements :
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
Si j'essaie git rebase origin/master
à partir de master, je suis obligé de résoudre tous les conflits à nouveau, et je perds également le commit de fusion :
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
Existe-t-il un moyen propre de rebaser le commit de fusion pour que je me retrouve avec un historique comme celui que je montre ci-dessous ?
* 51984c7 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | e7affba 4 [origin/master]
* | eb3b733 3
|/
* 38abeae 1
88 votes
TL;DR :
git rebase --preserve-merges origin/master
6 votes
En ce qui concerne la nécessité de résoudre à nouveau les conflits, vous pouvez consulter les documents suivants git rerere .
1 votes
git config --global pull.rebase preserve
pour toujours préserver les commits de fusion lors d'un rebasement12 votes
Attention : à partir de Git 2.18 (Q2 2018, 5 ans après),
git --rebase-merges
remplacera à terme l'anciengit --preserve-merges
. Voir Que signifie exactement le terme "rebase --preserve-merges
" font (et pourquoi ?)0 votes
Plus court encore
git rebase -p origin/master
13 votes
--preserve-merges
est déprécié. Utilisezgit rebase --rebase-merges origin/master