Fusionner
Avance rapide, commit de fusion, conflits — et comment les lire.
Fusionner, c'est faire converger deux lignes de développement. Git distingue deux situations, et sait laquelle s'applique.
L'avance rapide
Si la branche cible n'a pas bougé depuis que l'autre en est partie, il n'y a rien à réconcilier : Git se contente d'avancer le pointeur.
avant : A───B───C (main)
\
D───E (correctif)
après : A───B───C───D───E (main, correctif)Aucun commit n'est créé. L'historique reste linéaire — et ne garde aucune trace du fait qu'une branche a existé.
Le commit de fusion
Si les deux branches ont divergé, Git crée un commit qui a deux parents.
A───B───C───F (main)
\ /
D───E (fonction)F est le commit de fusion : il enregistre que ces deux histoires n'en font plus
qu'une. C'est le seul type de commit à plusieurs parents, et c'est ce qui rend
l'historique lisible comme un graphe.
git merge --no-ff force ce commit même quand une avance rapide serait possible :
certaines équipes le préfèrent, pour que chaque fonctionnalité reste identifiable
dans l'historique.
Un conflit n'est pas une erreur
Git s'arrête quand deux branches modifient les mêmes lignes du même fichier : il ne peut pas décider à ta place.
<<<<<<< HEAD
const TIMEOUT = 30;
=======
const TIMEOUT = 60;
>>>>>>> fonctionEntre <<<<<<< et ======= : ta version, celle de la branche courante. Entre
======= et >>>>>>> : celle qui arrive. Résoudre consiste à écrire le contenu
final — qui peut être l'une, l'autre, ou aucune des deux — puis à supprimer les
trois marqueurs, git add le fichier et conclure par git commit.
Le conflit silencieux
Git compare des lignes, pas des intentions. Deux branches peuvent se fusionner sans le moindre conflit et produire un code cassé : l'une renomme une fonction, l'autre ajoute un appel à l'ancien nom. Aucune ligne commune, donc aucun conflit — et une erreur à l'exécution. Une fusion sans conflit n'est pas une fusion validée : ce sont les tests qui le disent.
Fusion ou rebase
merge | rebase | |
|---|---|---|
| Historique | graphe, avec la trace des branches | linéaire |
| Commits | conservés tels quels | recréés, nouvelles empreintes |
| Sur une branche partagée | sans danger | à proscrire |
Le choix est une convention d'équipe, pas une question technique. Il est traité en détail dans Réécrire l'histoire et, du point de vue des stratégies de branches, dans Architectures de pipelines.
Réponse unique
Dans quel cas Git réalise-t-il une avance rapide plutôt qu'un commit de fusion ?
Indice · Y a-t-il vraiment deux histoires à réconcilier ?
[ METTRE EN PRATIQUE ]
Provoquer et résoudre un conflit
3 étapes · 25 min · 120 XP
[ CETTE LEÇON DANS LES PARCOURS ]
- Fondamentauxétape 4 / 18suivant — Les dépôts distants →
- Ingénieur DevOpsétape 7 / 23suivant — Les dépôts distants →