GIT - 18 Les différentes types de branches et de merges
Le branching et le merge sont des concepts centraux de Git. Git facilite énormément la création et la fusion de branches par rapport aux anciens outils — au point que de nombreux workflows de développement s'appuient entièrement dessus. Comme vu précédemment, une branche est simplement une timeline de commits. Plus précisément, les branches sont les noms (ou étiquettes) que nous donnons à ces timelines.
Créer ou supprimer une branche ne modifie pas la timeline elle-même : on ajoute ou retire juste une étiquette pointant vers un commit. Jusqu'ici, nous avons travaillé exclusivement sur la branche master. Désormais, nous allons créer une nouvelle branche pour effectuer du travail isolé, puis la fusionner dans master via un git merge. Lors de la fusion, Git s'efforce d'unifier les changements automatiquement quand c'est possible.
Les 3 types de merge
- Fast-forward merge : c'est le cas le plus simple. Quand aucun travail supplémentaire n'a été détecté sur la branche cible (par exemple
master), Git applique simplement tous les commits de l'autre branche directement, comme si la ramification n'avait jamais eu lieu. On peut désactiver le fast-forward si on souhaite préserver l'historique de branche. - Merge automatique (3-way merge) : Git détecte des modifications non conflictuelles dans la branche, qu'il résout automatiquement. L'historique de l'ancienne branche est préservé, et un nouveau commit de merge est créé pour représenter la fusion des deux timelines.
- Merge manuel : quand Git est incapable de résoudre automatiquement les conflits (modifications sur les mêmes lignes des mêmes fichiers), il entre dans un état spécial de merge en conflit. Tous les conflits doivent être résolus manuellement avant de pouvoir poursuivre avec un commit.
Une fois tous les conflits résolus, ces modifications sont enregistrées sous forme de commit de merge. Comprendre ces trois scénarios est essentiel pour maîtriser les workflows Git en équipe et éviter les surprises au moment de fusionner du code.
En résumé
Le branching et le merge sont des concepts fondamentaux de Git qui facilitent la gestion collaborative du code. Une branche est simplement une étiquette ou un pointeur vers une timeline de commits, permettant de créer et supprimer des branches sans affecter l'historique principal. Git gère automatiquement trois types de merges : le fast-forward (application directe des commits), le merge automatique (résolution auto des conflits mineurs), et le merge manuel (pour les conflits que Git ne peut pas résoudre seul).
Points clés
- Une branche est une étiquette donnée à une timeline de commits — la créer ou la supprimer ne supprime que l'étiquette, pas les commits
- Merge fast-forward : Git applique tous les commits d'une branche directement sur la branche cible, sans créer de commit de merge
- Merge automatique : quand Git détecte des modifications non-conflictuelles, il résout automatiquement et crée un commit de merge pour tracer la fusion
- Merge manuel : quand Git rencontre des conflits non-résolubles automatiquement, il entre en état de conflit jusqu'à résolution manuelle
- Les merges fast-forward peuvent être désactivés si un historique de fusion explicite est requis
Questions fréquentes
Qu'est-ce qu'une branche dans Git ?
Une branche est une étiquette ou un nom qu'on attribue à une timeline de commits. Créer une branche revient à créer une étiquette supplémentaire ; supprimer une branche supprime juste l'étiquette, pas les commits.
Quels sont les trois types de merges dans Git ?
Le merge fast-forward (application directe des commits sans commit de merge), le merge automatique (Git résout les modifications non-conflictuelles et crée un commit de merge), et le merge manuel (nécessaire quand Git détecte des conflits non-résolubles automatiquement).
Que fait Git quand il détecte un conflit de merge ?
Git entre dans un état de merge conflictuel spécial. Tous les conflits doivent être résolus manuellement et enregistrés avant de finaliser le commit de merge.