Skip to content
Commencer

Fusionner des Branches et Résoudre les Conflits

SlidesPDFPPTX
Niveau : Beginner
Durée : 2h

Prérequis

  • Maîtriser les branches (Atelier 05)
  • Savoir faire des commits conventionnels (Atelier 04)
  • Comprendre git status et git log

Objectifs d'apprentissage

  • Différencier fast-forward, 3-way et squash (et savoir quand rebase intervient)
  • Exécuter git merge et gérer --no-ff, --ff-only, --abort, --continue
  • Lire les marqueurs de conflit et résoudre avec git add + commit
  • Utiliser mergetool et rerere pour accélérer les résolutions

Une fois votre feature-contact validée, vous l’intégrez dans main. Règle d’or :

On se place sur la branche qui reçoit, puis on appelle la branche à fusionner.

Terminal window
git switch main
git merge feature-contact
<pre dir="ltr" class="mermaid">gitGraph commit id: &quot;Initial&quot; branch feature-contact checkout feature-contact commit id: &quot;Formulaire&quot; checkout main merge feature-contact id: &quot;Fusion&quot;</pre>

À faire

bash git switch main git merge feature-contact git branch -d feature-contact

À éviter

bash git switch feature-contact git merge main # ← inverse !


main n’a pas bougé depuis la création de feature-contact → Git déplace le pointeur.

<pre dir="ltr" class="mermaid">gitGraph commit id: &quot;C0&quot; branch feature-contact checkout feature-contact commit id: &quot;F1&quot; checkout main merge feature-contact</pre>

Message :

Updating a1b2c3d..e4f5a6b
Fast-forward
contact.html | 1 +

main et feature-contact ont tous deux avancé → Git crée un commit de fusion M.

<pre dir="ltr" class="mermaid">gitGraph commit id: &quot;C0&quot; commit id: &quot;C1&quot; branch feature-contact commit id: &quot;F1&quot; checkout main commit id: &quot;C2&quot; merge feature-contact id: &quot;M: merge F1&quot;</pre>

Historique :

Terminal window
git log --oneline --graph --all
# * a1b2c3d (HEAD -> main) Merge branch 'feature-contact'
# |\
# | * e4f5a6b feat: formulaire
# * | c2d3e4f C2: hotfix typo
# |/
# * b0c9d8e C1
Option Effet Usage
git merge --ff-only Refuse si pas fast-forward CI qui exige linéaire
git merge --no-ff Force un commit de merge même si fast-forward possible Garder trace de la feature
git merge --squash Écrase tous les commits de la branche en un seul Feature à 15 commits → 1 commit propre sur main
Terminal window
git switch main
git merge --no-ff feature-contact -m "Merge feature/contact"
git merge --squash feature-login
git commit -m "feat: add login (squashed)"

Commandes à exécuter

bash
# Cliquez sur les commandes à gauche pour les exécuter dans le simulateur
hashcode-academy:~$_

Utile quand feature-login a 15 commits “wip” :

Terminal window
git switch main
git merge --squash feature-login
git status
# Changes to be committed: login.html, auth.js
git commit -m "feat: add login"

Historique main reste propre (1 commit au lieu de 15).

Terminal window
git merge --abort # en plein conflit, tout annule
git merge --continue # après avoir résolu et git add

Conflit = même ligne, même fichier, deux versions différentes.

main: <h1>HashCode Workshops</h1>
feature-titre: <h1>Académie technique</h1>
→ Git ne peut choisir → vous tranchez.
<<<<<<< HEAD
<h1>Bienvenue sur HashCode Workshops</h1>
=======
<h1>Bienvenue sur notre académie technique</h1>
>>>>>>> feature-titre
Marqueur Signification
<<<<<<< HEAD Début version courante (main)
======= Séparateur
>>>>>>> feature-titre Fin version entrante

Voir l’état :

Terminal window
git status
# You have unmerged paths.
# Unmerged paths:
# both modified: index.html
git diff --check # repère les marqueurs oubliés

Commandes à exécuter

bash
# Cliquez sur les commandes à gauche pour les exécuter dans le simulateur
hashcode-academy:~$_

  1. Ouvrir index.html dans VS Code
  2. Choisir : garder une version, l’autre, ou combiner :
    <h1>Bienvenue sur HashCode Workshops — Académie technique</h1>
  3. Supprimer les 3 lignes de marqueurs (<<<<<<<, =======, >>>>>>>)
  4. Enregistrer
  5. Stager :
    Terminal window
    git add index.html
  6. Commiter :
    Terminal window
    git commit -m "Merge feature-titre : resolve title conflict"
    # ou
    git merge --continue

Vérifiez :

Terminal window
git log --oneline -2
git status # clean

Commandes à exécuter

bash
# Cliquez sur les commandes à gauche pour les exécuter dans le simulateur
hashcode-academy:~$_

Lance votre outil visuel (VS Code, Meld, Beyond Compare) :

Terminal window
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
git mergetool

Avec --merge, VS Code ouvre la vue de fusion 3-way (résultat, courant, origine) — bien plus lisible que $MERGED seul.

Git mémorise comment vous avez résolu un conflit et le réapplique automatiquement s’il revient :

Terminal window
git config --global rerere.enabled true
# La prochaine fois, Git dira :
# Resolved 'index.html' using previous resolution.

Question

Sur quelle branche lancer git merge ?

Cliquer pour révéler la réponse
Réponse

Sur la branche qui reçoit (ex: git switch main puis git merge feature-xxx).

Cliquer pour voir la question
Question

Fast-forward vs 3-way ?

Cliquer pour révéler la réponse
Réponse

Fast-forward : déplacement de pointeur (linéaire). 3-way : commit de fusion M quand les deux branches ont divergé.

Cliquer pour voir la question
Question

Que fait --no-ff ?

Cliquer pour révéler la réponse
Réponse

Force un commit de merge même si fast-forward possible — garde trace de la feature.

Cliquer pour voir la question
Question

Quand conflit ?

Cliquer pour révéler la réponse
Réponse

Même ligne, même fichier modifié différemment sur deux branches.

Cliquer pour voir la question
Question

3 marqueurs ?

Cliquer pour révéler la réponse
Réponse

<<<<<<< HEAD, =======, >>>>>>> branche (début, séparateur, fin entrante).

Cliquer pour voir la question
Question

Étapes résolution ?

Cliquer pour révéler la réponse
Réponse

Éditer → choisir/combiner → supprimer marqueurs → git add → git commit / --continue.

Cliquer pour voir la question
Question

Comment annuler un merge en cours ?

Cliquer pour révéler la réponse
Réponse

git merge --abort

Cliquer pour voir la question
Question

Que fait rerere ?

Cliquer pour révéler la réponse
Réponse

Mémorise et réapplique automatiquement une résolution déjà faite.

Cliquer pour voir la question

1. Sur quelle branche lancer git merge ?

2. Quand Git crée-t-il un commit de merge ?

3. Après résolution manuelle, que faire ?

4. Que fait git merge --squash ?


Terminal window
# Fusion
git switch main
git merge feature-xxx
git merge --ff-only feature-xxx
git merge --no-ff feature-xxx -m "Merge feature"
git merge --squash feature-xxx && git commit -m "feat: add xxx"
git merge --abort
git merge --continue
# Conflit
git status # UU = Unmerged
git diff --check
git add <fichier>
git commit -m "resolve conflict"
git log --oneline --graph --all
# Outils
git config --global merge.tool vscode
git mergetool
git config --global rerere.enabled true

Votre Progression0%


  • merge se lance depuis la receveuse (main).
  • fast-forward = linéaire, 3-way = commit M, squash = 1 commit propre.
  • Conflit → éditer, supprimer marqueurs, git add + git commit/--continue.
  • rerere et mergetool vous font gagner un temps fou en équipe.

Vous maîtrisez le local. Connectons le dépôt à GitHub pour collaborer à distance.

Étape suivante : Collaborer sur GitHub

HashCode Workshops
Part of the JoinHashCode ecosystem

Ctrl + K Rechercher dans les workshops