Exercice 03 : Résoudre les Conflits de Fusion
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Reconnaître quand un conflit se produit
- ✅ Comprendre les marqueurs de conflit (
<<<<<<<,=======,>>>>>>>) - ✅ Résoudre les conflits manuellement
- ✅ Finaliser le merge avec un commit
- ✅ Stratégies pour éviter les conflits
Durée estimée : 20 minutes
Difficulté : ⭐⭐☆☆☆ (Intermédiaire)
Prérequis :
- Avoir complété Exercice 02 (connaître les branches et merges)
📖 Contexte
Un conflit de fusion se produit quand :
- Deux branches modifient la même ligne du même fichier
- Git ne sait pas quelle version garder
Exemple :
main : print("Hello")
feature: print("Hi")Git dit : "Je ne peux pas décider automatiquement. À vous de choisir ! "
C'est une situation très commune en équipe. Faut savoir la gérer.
📋 Énoncé
Vous allez :
- Créer deux branches qui modifient le même fichier
- Créer intentionnellement un conflit
- Déclencher le conflit en faisant un merge
- Voir les marqueurs de conflit
- Résoudre le conflit manuellement
- Finaliser le merge
Résultat attendu :
- Merge réussi après résolution
- Fichier final contient les changements consensuels
- Commit de merge créé
🔧 Matériel Nécessaire
- Git : déjà installé
- Repository : celui du Exercice 02 (ou créer nouveau)
- Éditeur : Notepad, nano, VS Code idéalement (pour visualiser facilement)
- Terminal
- Temps : 30 minutes
🧭 Déroulement de l'exercice
Voici les grandes étapes à réaliser dans l'ordre. Chaque étape décrit ce que vous devez accomplir - à vous de trouver la commande. La solution complète est disponible si vous êtes bloqué.
Tâche 1 : Créer un fichier de base partagé
Créez un fichier config.txt avec plusieurs lignes de configuration (clé = valeur), puis committez-le sur main. Ce fichier sera la base commune des deux branches.
Indice : Le fichier doit exister dans
git logavant de créer les branches. Assurez-vous d'être surmainet d'avoir un commit propre.
Vérification : git log --oneline doit afficher le commit avec ce fichier.
Tâche 2 : Créer une première branche et modifier une ligne
Créez une branche feature/change-port et modifiez la valeur server_port dans config.txt. Committez ce changement.
Indice : Vous pouvez modifier la ligne avec un éditeur de texte ou avec
sed. La valeur exacte importe peu - l'essentiel est que cette ligne soit différente de celle dansmain.
Vérification : git diff main depuis cette branche doit montrer votre modification.
Tâche 3 : Créer une deuxième branche depuis main et modifier la MÊME ligne
Retournez sur main, créez une branche feature/change-env et modifiez à nouveau server_port dans config.txt - mais avec une valeur DIFFÉRENTE de la première branche. Committez.
Indice : La clé d'un conflit : les deux branches modifient la même ligne. Si elles touchaient des lignes différentes, Git fusionnerait automatiquement sans conflit.
Vérification : Les deux branches ont maintenant des versions différentes de la même ligne dans config.txt.
Tâche 4 : Merger la première branche (sans conflit)
Retournez sur main et mergez feature/change-port. Ce premier merge doit réussir sans conflit.
Indice : Le premier merge sera propre car
mainn'a pas touché àconfig.txtdepuis que cette branche a été créée.
Vérification : Git doit afficher un message de succès (pas de "CONFLICT").
Tâche 5 : Déclencher et identifier le conflit
Mergez maintenant feature/change-env. Git doit refuser et signaler un conflit.
Indice : Git marque les zones conflictuelles avec
<<<<<<<,=======et>>>>>>>. Ouvrez le fichier en conflit pour les voir.
Question à se poser : Que représente chaque bloc entre les marqueurs ? Lequel vient de main ? Lequel vient de la branche entrante ?
Vérification : Git doit afficher "CONFLICT" et git status doit montrer le fichier comme "both modified".
Tâche 6 : Résoudre le conflit et finaliser le merge
Ouvrez le fichier conflictuel dans un éditeur. Supprimez les marqueurs de conflit et gardez la version finale que vous souhaitez. Ensuite, finalisez le merge.
Indice : Après avoir modifié et sauvegardé le fichier, le processus reprend comme un commit normal : ajoutez au staging, puis committez. Git proposera un message de merge automatiquement.
Vérification : git log --oneline --graph doit montrer un commit de merge avec deux branches qui se rejoignent. Le fichier ne doit plus contenir <<<<<<<.
� Mini-Projet : Gérer des changements concurrents
Vous allez simuler deux développeurs qui travaillent sur le même fichier et résoudre le conflit qui en résulte.
Scénario : Vous avez un fichier app-config.json contenant des paramètres de l'application. Deux membres de l'équipe modifient chacun une valeur différente - mais sur la même ligne.
Ce que vous devez réaliser :
- Sur
main, créezapp-config.jsonavec au moins 5 paramètres (ex:version,port,debug,timeout,max_users) - faites un commit - Créez
feature/team-settingsdepuismain, modifiezmax_usersettimeout- faites un commit - Revenez sur
main, créezfeature/dev-settings, modifiezmax_usersà une valeur différente etdebug- faites un commit - Mergez
feature/team-settingsdansmain(sans conflit) - Tentez de merger
feature/dev-settings- un conflit doit apparaître surmax_users - Résolvez le conflit en choisissant une valeur cohérente
- Finalisez le merge
Checkpoints de validation :
app-config.jsonne contient aucun marqueur de conflit (<<<<<<<,=======,>>>>>>>)git log --oneline --graphmontre deux branches qui convergentgit statusaffiche "nothing to commit, working tree clean"- Le fichier final contient des valeurs provenant des DEUX branches (pas juste l'une des deux)
- L'historique compte au moins 4 commits (initial + 2 features + 1 merge)
- Les deux branches feature ont été supprimées après merge
�📚 Étapes Détaillées
Étape 1 : Préparer le Repository
Objectif : S'assurer qu'on part d'une base commune
Instructions:
- Aller dans le repository :
cd ma-premiere-app- Vérifier qu'on est sur main :
git branchRésultat attendu :
* main- Vérifier les commits récents :
git log --oneline -5Étape 2 : Créer un Fichier de Configuration
Objectif : Créer un fichier qui sera modifié sur deux branches
Instructions:
- Créer un fichier
config.txt:
echo "# Configuration de l'application
server_name = localhost
server_port = 8000
debug = true
database = sqlite
" > config.txt- Vérifier le contenu :
cat config.txt- Committer ce fichier :
git add config.txt
git commit -m "Ajouter fichier de configuration"Résultat attendu :
[main 9f8a3d2] Ajouter fichier de configuration
1 file changed, 6 insertions(+)
create mode 100644 config.txtÉtape 3 : Créer Une Première Branche
Objectif : Créer une branche qui modifiera le fichier de config
Instructions:
- Créer et basculer vers une branche
feature/change-port:
git checkout -b feature/change-port- Modifier le fichier
config.txt- Changer le port :
# Ouvrir config.txt avec un éditeur
# Changer "server_port = 8000" en "server_port = 3000"
#
# Sur Linux/Mac, vous pouvez utiliser sed:
sed -i 's/server_port = 8000/server_port = 3000/' config.txt
# Sur Windows, utiliser notepad:
notepad config.txt
# ... éditer manuellement ...- Vérifier la modification :
cat config.txtRésultat attendu :
server_port = 3000- Committer le changement :
git add config.txt
git commit -m "Changer le port du serveur à 3000"Étape 4 : Créer Une Deuxième Branche (à partir de main)
Objectif : Créer une autre branche qui modifiera la même ligne
Instructions:
- Revenir à main :
git checkout main- Vérifier que le port est revenu à 8000 :
cat config.txtRésultat attendu :
server_port = 8000- Créer une nouvelle branche
feature/change-debug:
git checkout -b feature/change-debug- Modifier le fichier config - Modifier la même ligne (port) :
# Utiliser sed (Linux/Mac)
sed -i 's/server_port = 8000/server_port = 5000/' config.txt
# Ou éditer manuellement avec notepad/nano- Vérifier :
cat config.txtRésultat attendu :
server_port = 5000- Committer :
git add config.txt
git commit -m "Changer le port du serveur à 5000"Étape 5 : Déclencher le Conflit
Objectif : Tenter de merger les deux branches et créer un conflit
Instructions:
- Revenir à main :
git checkout main- Vérifier votre branche actuelle :
git branchRésultat attendu :
feature/change-debug
feature/change-port
* main- Merger la première branche (sans conflit) :
git merge feature/change-portRésultat attendu :
Updating 9f8a3d2..8b7c4e3
Fast-forward
config.txt | 2 +-
1 file changed, 1 insertion(+)- Vérifier le contenu (devrait avoir port 3000) :
cat config.txt- Maintenant, merger la deuxième branche (qui créera le conflit) :
git merge feature/change-debugRésultat attendu :
Auto-merging config.txt
CONFLICT (content): Merge conflict in config.txt
Automatic merge failed; fix conflicts and then commit the result.🎯 Le conflit est déclenché !
Étape 6 : Examiner le Fichier en Conflit
Objectif : Voir comment Git marque les conflits
Instructions:
- Ouvrir le fichier
config.txt:
cat config.txtRésultat attendu :
# Configuration de l'application
server_name = localhost
<<<<<<< HEAD
server_port = 3000
=======
server_port = 5000
>>>>>>> feature/change-debug
debug = true
database = sqliteDécodage des marqueurs :
<<<<<<< HEAD= Début de la version actuelle (main)server_port = 3000= Version de main======== Séparateurserver_port = 5000= Version de la branche mergée (feature/change-debug)>>>>>>> feature/change-debug= Fin de la version à merger
- Vérifier le statut Git :
git statusRésultat attendu :
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to include in what will be committed)
both modified: config.txtÉtape 7 : Résoudre le Conflit
Objectif : Choisir manuellement la version correcte
Instructions:
Scénario : Pour l'exemple, disons que le bon port est 8080 (un compromis).
- Ouvrir
config.txtavec un éditeur :
# Linux/Mac avec nano
nano config.txt
# Ou Windows avec notepad
notepad config.txt
# Ou VS Code
code config.txt- Éditer le fichier pour supprimer les marqueurs de conflit et mettre la bonne valeur :
# Configuration de l'application
server_name = localhost
server_port = 8080
debug = true
database = sqlitePoints importants :
- Supprimer les trois lignes de marqueurs (
<<<<<<<,=======,>>>>>>>) - Garder le contenu que vous voulez
- Possibilités :
- Garder seulement la version HEAD (8000 → 3000)
- Garder seulement la version entrante (5000)
- Combiner les deux ou mettre une valeur nouvelle (8080)
- Sauvegarder le fichier
Étape 8 : Ajouter le Fichier Résolu
Objectif : Dire à Git que le conflit est résolu
Instructions:
- Ajouter le fichier (ce qui indique qu'il est résolu) :
git add config.txt- Vérifier le statut :
git statusRésultat attendu :
On branch main
All conflicts fixed but you are still merging.
(use "git commit" to conclude the merge)
Changes to be committed:
modified: config.txtÉtape 9 : Finaliser le Merge avec un Commit
Objectif : Créer le commit de merge
Instructions:
- Créer le commit de merge :
git commit -m "Résoudre conflit entre feature/change-port et feature/change-debug
- Port final : 8080
- Choix : compromis entre 3000 et 5000"Résultat attendu :
[main 1f9c3a4] Résoudre conflit entre feature/change-port et feature/change-debug- Vérifier le statut (ne doit plus dire "merging") :
git statusRésultat attendu :
On branch main
nothing to commit, working tree cleanÉtape 10 : Vérifier le Résultat Final
Objectif : Confirmer que le merge est complet
Instructions:
- Vérifier le fichier final :
cat config.txtRésultat attendu :
# Configuration de l'application
server_name = localhost
server_port = 8080
debug = true
database = sqlite- Voir l'historique :
git log --oneline -5Résultat attendu :
1f9c3a4 Résoudre conflit entre feature/change-port et feature/change-debug
8b7c4e3 Changer le port du serveur à 3000
9f8a3d2 Ajouter fichier de configuration
7c3f1e9 Ajouter instructions d'installation
5b2c9d8 Ajouter guide de contribution- Voir le graphe (si possible) :
git log --oneline --graph✅ Vérification du Résultat
Pour vérifier que vous avez réussi :
# Vérifier qu'il n'y a pas de marqueurs de conflit
grep -i "<<<<<<" config.txt # Ne doit rien afficher
# Vérifier le port est 8080
grep "server_port" config.txt # Doit afficher "server_port = 8080"
# Vérifier l'historique
git log --oneline -5 # Doit montrer le commit de mergeChecklist finale :
- ✅ Conflit créé intentionnellement
- ✅ Marqueurs de conflit compris et supprimés
- ✅ Fichier résolu correctement
- ✅ Merge finalisé avec commit
- ✅ Pas de traces de conflit dans le fichier final
🎮 Défi Bonus
Défi 1 : Créer un conflit sur plusieurs lignes
# Créer deux branches qui modifient des sections différentes
# Mais de manière à créer des conflits
git checkout main
git checkout -b feature/full-config
# ... modifier plusieurs sections ...Défi 2 : Annuler un merge en cours
# Si vous faites une erreur lors du merge:
git merge --abort
# Cela annule le merge comme s'il ne s'était pas produitDéfi 3 : Utiliser un outil de merge graphique
# Mérgétool interactif (si configuré)
git mergetool
# Cela ouvre un outil visuel pour résoudre les conflits
# Recommandé : VS Code, meld, ou p4mergeDéfi 4 : Comprendre les stratégies de merge
# Voir les branches et leurs bases communes
git merge-base main feature/change-debug
# Simuler le merge sans l'appliquer
git merge --no-commit feature/change-debug
git merge --abort💡 Points Clés à Retenir
- Marqueurs de conflit :
<<<<<<<,=======,>>>>>>>marquent les sections en conflit - HEAD toujours en haut : HEAD est le commit actuel (sur
main), l'autre branche est en bas - Résolution manuelle : Vous devez décider quelle version garder
- Committer la résolution : Le merge n'est pas complet jusqu'au commit
- git merge --abort : Annuler si nécessaire
🎯 Prochaines Étapes
- ✅ Vous savez résoudre les conflits de fusion
- 🔜 Exercice suivant : Synchroniser avec GitHub
- 🚀 Index des exercices : Tous les exercices
Excellent ! Les conflits n'ont plus de secret pour vous ! 🎉