Cours
Tutoriel Git Merge : Un guide complet avec des exemples
Si vous avez déjà travaillé sur un projet avec plusieurs développeurs (ou même simplement géré plusieurs fonctionnalités vous-même), vous savez que le branchement est essentiel pour garder les choses organisées. Mais à un moment donné, toutes ces branches doivent être réunies, et c'est là que git merge
entre en jeu.
Dans ce tutoriel, je vais vous présenter les différents types de fusion Git, leur fonctionnement et la manière de résoudre les conflits de fusion lorsque les choses ne se déroulent pas comme prévu. Enfin, je partagerai avec vous quelques bonnes pratiques pour vous aider à utiliser efficacement git merge
et à éviter les pièges les plus courants.
Qu'est-ce que git merge ?
Dans une équipe, les développeurs travaillent souvent sur différentes fonctionnalités, corrections de bogues et améliorations dans des branches distinctes. Une fois leur travail terminé, ils utilisent git merge
pour intégrer ces changements.
La fusion combine les modifications d'une branche dans une autre tout en préservant l'historique complet des versions. Il unifie l'historique des livraisons des deux branches.
Comprenons le déroulement des opérations à l'aide d'un exemple.
Un commit de base commun diverge en deux branches, conduisant à des main tips et feature tips distincts avant la fusion. Image par l'auteur.
Dans l'image ci-dessus, les branches feature et main ont créé de nouveaux commits depuis la création de la branche feature.
Une branche de fonctionnalités et la branche principale divergent d'une base commune et sont ensuite combinées en un seul commit de fusion. Image par l'auteur.
Git merge prend tous les nouveaux commits des deux branches, à partir de leur base commune, et les combine en un seul commit de fusion. Ensuite, il met à jour le pointeur d'en-tête pour qu'il pointe vers ce nouveau commit de fusion.
Utilisation de base de la commande git merge
La fusion ne consiste pas simplement à lancer git merge et à s'arrêter là - il y a quelques étapes clés à suivre pour que tout soit en ordre. Dans cette section, nous allons parcourir l'ensemble du processus, de la préparation de vos branches à la réalisation d'une fusion réussie.
Étape 1 : Préparer une fusion
Seules les modifications engagées dans les deux branches peuvent être fusionnées. Utilisez donc la commande git status
pour vérifier les modifications non validées et validez-les à l'aide de la commande git commit
avant de procéder à la fusion.
Étape 2 : Consultez la branche cible
Avant d'exécuter git merge
, vous devez passer à la branche cible, généralement la branche principale. Passez à la branche principale en utilisant git checkout main
ou git switch main
.
Étape 3 : Fusionner une branche
Assurez-vous que la branche principale est à jour avec le dépôt distant. Pour cela, lancez git pull origin main
.
Maintenant, vous êtes enfin prêt à fusionner la branche des fonctionnalités dans la branche principale ! Vous pouvez utiliser une commande comme la suivante :
git merge feature-branch
Étape 4 : Résolution des conflits de fusion (le cas échéant)
Git tente de résoudre automatiquement les conflits qui peuvent survenir lors des fusions. Toutefois, une intervention manuelle peut s'avérer nécessaire lorsqu'il ne parvient pas à résoudre le conflit par lui-même.
Par exemple, si les mêmes lignes d'un même fichier sont modifiées dans différentes branches, des conflits de fusion peuvent survenir.
Lorsque Git détecte un conflit, il interrompt la fusion et vous demande de le résoudre. Dans ce cas :
- Exécutez
git status
pour voir quels sont les fichiers qui présentent des conflits. - Ouvrez ces fichiers.
- Examinez les lignes de code conflictuelles et mettez-les à jour pour assurer la cohérence des deux branches.
Étape 5 : Validation de la fusion
Après avoir résolu les conflits, utilisez la commande git add .
pour mettre en scène les fichiers corrigés. Ensuite, terminez la fusion en vous engageant par un message :
git merge -m “resolved conflicts”
Dans les sections suivantes, nous verrons comment résoudre les conflits de fusion de manière plus approfondie.
Pour les débutants, voici un guide complet de Git couvrant toutes les commandes essentielles pour créer, mettre à jour, supprimer et gérer les branches.
Si vous avez déjà une certaine expérience de Git et que vous avez besoin d'une remise à niveau sur les commandes importantes, consultez ce tutoriel sur les commandes Git les plus utilisées avec des exemples.
Apprenez les bases de Git dès aujourd'hui
Types de fusions dans Git
Comprendre les types de fusion de Git vous aidera à choisir la bonne stratégie pour votre scénario. Voici les trois approches les plus courantes en matière de fusion.
Fusion en avance rapide
Lorsque la branche de base n'a pas de nouveaux commits depuis la création de la branche de fonctionnalité, Git utilise une approche d'avance rapide.
Si votre nouvelle branche de fonctionnalités est mise à jour alors que la branche principale reste inchangée, le commit de fusion déplace le pointeur de tête de la branche principale vers la branche de fonctionnalités.
Aucun commit de fusion supplémentaire n'est créé, ce qui permet de conserver un historique des commits propre et linéaire.
Fusion à trois
Si les branches base et fonctionnalités ont toutes deux de nouveaux commits, Git trouvera leur ancêtre commun et créera un nouveau commit de fusion. Ce commit combine les historiques des deux branches, en préservant l'historique individuel de la branche des fonctionnalités et de la branche principale.
Dans l'exemple ci-dessous, "E" et "G" sont de nouvelles modifications apportées à la branche principale après la création de la branche des fonctionnalités.
C---D---F (feature-branch)
/
A---B---E---G (main)
Un nouveau commit de fusion, "M", est créé, préservant l'historique des branches principale et secondaire.
C---D---F
/ \
A---B---E---G---M (main)
Fusion des courges
Squash merge combine toutes les modifications d'une branche de fonctionnalités en un seul commit et le fusionne dans la branche cible. Il ne préserve pas l'historique des livraisons individuelles de la branche de fonctionnalité.
git merge --squash feature_branch_name
Un squash merge est particulièrement utile pour éviter l'encombrement de plusieurs petits commits tout en conservant l'état final de la fonctionnalité dans la branche cible.
Fusionner plusieurs branches
Lorsque vous travaillez sur des projets de grande envergure, vous pouvez être amené à fusionner plusieurs branches, soit une à la fois, soit toutes en même temps. L'approche que vous choisissez dépend de votre flux de travail et de la complexité des changements. Dans cette section, je vais explorer les deux méthodes et vous indiquer quand les utiliser efficacement.
Fusionner plusieurs branches séquentiellement
Pour fusionner les branches une par une, utilisez la commande merge séquentiellement pour chaque branche d'élément.
Étape 1 : Passez à la branche cible dans laquelle vous souhaitez fusionner les modifications.
git checkout target_branch_name
Étape 2 : Fusionnez la première branche de fonctionnalités, comme indiqué ci-dessous.
git merge feature_branch_1
Étape 3 : Fusionnez la deuxième branche de fonctionnalités comme indiqué.
git merge feature_branch_2
Répétez ce processus jusqu'à ce que toutes les autres branches soient fusionnées.
Fusionner plusieurs branches en parallèle
Suivez les étapes suivantes pour fusionner plusieurs branches de fonctionnalités en une seule fois.
Étape 1 : Passez à la branche cible dans laquelle vous souhaitez fusionner les modifications.
git checkout target_branch_name
Étape 2 : Exécutez la commande suivante avec plusieurs branches de fonctionnalités
git merge feature_branch_1 feature_branch_2 feature_branch_3
Lorsque Git fusionne plusieurs branches en parallèle, des conflits peuvent survenir. Dans ce cas, Git vous invitera à les résoudre manuellement.
Gestion des conflits en cas de fusions multiples
La fusion de plusieurs branches n'est pas toujours simple, surtout lorsqu'une branche dépend d'une autre.
Par exemple, la fusion de feature_x
dans main
avant feature_y
peut introduire des conflits. De même, si différentes branches modifient les mêmes fichiers, les fusions parallèles peuvent entraîner des conflits qui doivent être résolus avec soin.
Procédez comme suit pour résoudre les conflits de fusion:
- Étape 1 : Exécutez
git status
pour voir quels sont les fichiers qui provoquent des conflits. - Étape 2 : Ouvrez les fichiers en conflit et corrigez-les.
- Étape 3 : Ajoutez les modifications à la scène et validez.
Comprendre l'historique des livraisons de la fusion
Pour les conflits complexes, il se peut que vous ayez besoin de plus d'informations que celles fournies par git status
. Dans ce cas, vous pouvez utiliser des commandes telles que git log
ou git show
pour approfondir l'historique.
git log
: affiche l'historique complet des livraisons, y compris les livraisons de fusion. Cela permet d'identifier une fusion spécifique où le problème se produit.git show
: Si vous trouvez un commit de fusion suspect à partir de la commande ci-dessus, utilisezgit show
pour l'inspecter. Cette commande fournit une vue détaillée de la livraison, montrant ce qui a été modifié pendant la fusion. Il produit également un identifiant unique pour la branche mère avant qu'une fusion spécifique ne soit effectuée.git diff
: Vous pouvez prendre les identifiants uniques de la branche mère et de la branche fusionnée des commandes précédentes et utilisergit diff
pour comparer les changements entre ces deux états.
Meilleures pratiques de fusion Git
La fusion peut parfois être difficile, en particulier lorsque plusieurs développeurs travaillent sur la même base de code.
Nous avons vu comment résoudre les conflits lorsqu'ils surviennent, mais la meilleure approche consiste à les prévenir avant qu'ils ne se produisent. Dans cette section, nous allons voir des astuces pratiques pour que vos fusions se fassent en douceur et que votre historique Git soit propre.
Limitez les branches et concentrez-vous
Les grandes branches augmentent le risque de chevauchement des modifications, ce qui multiplie les conflits. Pour minimiser ce phénomène, travaillez sur une seule fonctionnalité par branche et faites en sorte que les branches soient petites et ciblées.
Tirer et fusionner fréquemment
Tirez les dernières modifications du dépôt distant pour mettre à jour votre branche de base avant de la fusionner. Tirez régulièrement les mises à jour de la branche principale vers votre branche de fonctionnalité pour les garder synchronisées. Cela permet d'éviter des conflits importants et complexes par la suite.
Utilisez les outils de fusion intégrés à Git
Au lieu d'éditer manuellement les fichiers, vous pouvez utiliser les outils intégrés de git pour résoudre les conflits dans une interface visuelle. Lorsque vous exécutez git mergetool
, trois choix s'offrent à vous :
- LOCAL - Version de la branche principale. Ce choix permet de conserver le contenu du fichier conflictuel dans la branche principale et d'ignorer les modifications apportées par la branche des fonctionnalités.
- REMOTE - La version de la branche des fonctionnalités. Cette option permet d'appliquer le contenu de la branche de fonctionnalités au fichier en conflit.
- BASE - Cette option permet de combiner les modifications des fichiers conflictuels des deux branches et de les fusionner.
Fusionner dans l'ordre
Lors de la fusion de plusieurs branches, l'ordre est important, surtout si un élément dépend d'un autre. Si feature_x
s'appuie sur feature_y
, la fusion de feature_x
en premier lieu peut introduire des conflits. Pour éviter cela, fusionnez toujours les branches dans l'ordre de leurs dépendances afin d'assurer la fluidité du processus et de minimiser les conflits.
Fusion de courges
Comme mentionné précédemment, la fusion de courge consolide tous les commits d'une branche de fonctionnalité en un seul commit, ce qui permet de garder l'historique des commits propre et de réduire les conflits de fusion potentiels.
Une autre approche est le rebasage, qui consiste à appliquer les modifications de la branche des fonctionnalités directement sur la branche de base. Cela permet de créer un historique linéaire et d'éviter les modifications inutiles. Cependant, ces deux méthodes réécrivent l'historique et ne préservent pas les modifications individuelles de la branche des fonctionnalités.
Conclusion
Dans ce tutoriel sur la fusion Git, nous avons abordé tous les aspects de la fusion, depuis les principes de base jusqu'aux meilleures pratiques pour éviter les conflits. Comprendre comment utiliser efficacement git merge
aide les équipes à collaborer de manière transparente, à maintenir des flux de travail fluides et un historique de code propre.
Si vous souhaitez approfondir vos compétences en matière de Git, consultezce cours Git intermédiaire pour maîtriser desflux de travail et des techniques plus avancés !
Apprenez les bases de Git dès aujourd'hui
FAQ
Quelle est la différence entre git merge et git rebase ?
Alors que les deux commandes intègrent les modifications d'une branche dans une autre, git merge
crée un nouveau commit de fusion, préservant l'historique des deux branches. En revanche, git rebase
applique les commits de la branche des fonctionnalités directement sur la branche cible, ce qui permet d'obtenir un historique des commits linéaire, mais de réécrire l'historique au cours du processus.
Puis-je annuler une fusion dans Git ?
Oui, si vous n'avez pas encore poussé la fusion, vous pouvez utiliser :
git reset --hard HEAD~1
Cette opération réinitialise votre branche à l'état précédant la fusion. Si la fusion est déjà poussée, vous devrez utiliser git revert
pour annuler les modifications en toute sécurité tout en conservant l'historique intact.
Comment fusionner une branche distante dans ma branche locale ?
Pour fusionner une branche distante dans votre branche locale, procédez comme suit :
git fetch origin
git checkout my-branch
git merge origin/feature-branch
Cela permet de s'assurer que vous fusionnez les dernières mises à jour du référentiel distant.
Comment éviter les conflits de fusion inutiles ?
Pour minimiser les conflits :
- Tirez régulièrement les dernières modifications avant de commencer un nouveau travail (
git pull
). - Fusionner dans l'ordre des dépendances si plusieurs branches dépendent les unes des autres.
- Utilisez les drapeaux de fonctionnalités pour intégrer progressivement le code au lieu d'utiliser des branches de longue durée.
Que se passe-t-il lorsque je fusionne une branche qui a déjà été fusionnée ?
Si une branche a déjà été fusionnée, relancer git merge feature-branch
ne changera rien. Git reconnaîtra que les branches partagent un historique commun et confirmera simplement que tout est à jour.
Puis-je fusionner plusieurs branches à la fois ?
Non, Git ne permet pas de fusionner plusieurs branches en une seule commande. Vous devez les fusionner de manière séquentielle :
git merge feature-branch-1
git merge feature-branch-2
Si nécessaire, vous pouvez créer une branche d'intégration dans laquelle vous fusionnerez plusieurs branches, puis la fusionner dans main
.
Dois-je utiliser git merge --no-ff ou git merge --ff ?
--no-ff
(pas de fusion rapide) crée un nouveau commit de fusion, ce qui facilite le suivi de l'historique des branches.--ff
(fast-forward merge) applique les changements directement si possible, en évitant les modifications supplémentaires.
Pour les projets où le cursus des branches de fonctionnalités est important, --no-ff
est recommandé.
Srujana est rédactrice technique indépendante et titulaire d'un diplôme de quatre ans en informatique. Écrire sur divers sujets, notamment la science des données, l'informatique en nuage, le développement, la programmation, la sécurité et bien d'autres encore, est pour elle une évidence. Elle aime la littérature classique et la découverte de nouvelles destinations.
Apprenez-en plus sur Git avec ces cours !
Cours
Git intermédiaire
Cours