git rerere mémorise vos résolutions de conflits pour les rejouer
automatiquement, -Xours/-Xtheirs tranche les conflits en faveur
d'un côté, et --squash fusionne sans commit de merge. Ce guide
couvre les techniques avancées pour les merges complexes.
Prérequis : Merge et conflits et Reset démystifié.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Annuler un merge en cours avec
--abortsans laisser de traces - Favoriser une stratégie avec
-Xoursou-Xtheirspour les conflits massifs - Configurer
rererepour que Git mémorise vos résolutions de conflits
Annuler un merge en cours
Section intitulée « Annuler un merge en cours »Avant le commit de merge
Section intitulée « Avant le commit de merge »Si un merge produit des conflits et que vous voulez tout annuler :
git merge --abortLa commande tente de reconstruire l'état d'avant le git merge,
et c'est le mot que la documentation emploie. Elle y parvient presque
toujours, mais pas quand le merge a démarré avec des modifications non
commitées non triviales. Commitez ou remisez avant de fusionner :
c'est la recommandation de la documentation elle-même, et elle vous
épargne entièrement ce cas.
Après le commit de merge
Section intitulée « Après le commit de merge »Si le merge est déjà commité mais vous changez d'avis :
# Annuler le commit de merge (crée un commit d'annulation)git revert -m 1 HEAD-m 1 indique quel parent garder (1 = la branche dans laquelle
vous étiez).
Stratégies de résolution des conflits
Section intitulée « Stratégies de résolution des conflits »-Xours et -Xtheirs
Section intitulée « -Xours et -Xtheirs »Au lieu de résoudre manuellement chaque conflit :
# En cas de conflit, garder notre versiongit merge -Xours feature
# En cas de conflit, garder leur versiongit merge -Xtheirs feature-Xours: pour chaque conflit, garde le code de la branche courante-Xtheirs: pour chaque conflit, garde le code de la branche mergée
Les fichiers sans conflit sont mergés normalement dans les deux cas.
Résoudre fichier par fichier
Section intitulée « Résoudre fichier par fichier »Pour un contrôle fin, résolvez chaque fichier individuellement :
# En plein conflit, garder notre version de ce fichiergit checkout --ours -- src/config.pygit add src/config.py
# Garder leur version de cet autre fichiergit checkout --theirs -- src/utils.pygit add src/utils.py
# Finaliser le mergegit commitgit merge --squash
Section intitulée « git merge --squash »--squash applique toutes les modifications d'une branche sans créer
de commit de merge :
git merge --squash feature# Toutes les modifications sont dans le staginggit commit -m "feat: intégrer la feature X"Le résultat est un commit unique (pas de second parent). L'historique
de la branche feature est « aplati ».
| Critère | Merge normal | Merge --squash |
|---|---|---|
| Commit de merge | Oui (2 parents) | Non (1 parent, commit classique) |
| Historique de la branche | Préservé | Perdu (aplati) |
git log --graph | Montre la divergence | Linéaire |
| Traçabilité | Chaque commit visible | Un seul commit résumé |
Quand utiliser --squash :
- Branche feature avec beaucoup de commits WIP/debug
- Vous voulez un historique linéaire propre
- Les commits individuels n'apportent pas de valeur informative
git rerere : mémoriser les résolutions
Section intitulée « git rerere : mémoriser les résolutions »"REuse REcorded Résolution", Git mémorise comment vous résolvez un conflit et l'applique automatiquement si le même conflit se reproduit.
Activer rerere
Section intitulée « Activer rerere »git config --global rerere.enabled trueComment ça fonctionne
Section intitulée « Comment ça fonctionne »-
Un conflit survient et vous le résolvez manuellement.
-
Git enregistre la résolution dans
.git/rr-cache/. -
Plus tard, le même conflit sur les mêmes lignes se reproduit (rebase, merge d'une autre branche...).
-
Git applique automatiquement la résolution enregistrée.
Resolved 'src/config.py' using previous resolution. -
Vérifiez et commitez :
Fenêtre de terminal git diff # Vérifier la résolutiongit add .git commit
Commandes rerere
Section intitulée « Commandes rerere »# Voir les résolutions en attentegit rerere status
# Voir le diff des résolutionsgit rerere diff
# Oublier une résolution enregistréegit rerere forget src/config.py
# Vider tout le cache rereregit rerere gcConflits sur fichiers binaires
Section intitulée « Conflits sur fichiers binaires »Git ne peut pas merger des fichiers binaires (images, PDF, archives). En cas de conflit :
# Garder notre versiongit checkout --ours -- image.pnggit add image.png
# Ou garder leur versiongit checkout --theirs -- image.pnggit add image.pngPour des comparaisons visuelles, configurez un outil externe :
*.png diff=exif
# .gitconfig[diff "exif"] textconv = exiftoolMerge subtree
Section intitulée « Merge subtree »Merge un dépôt externe comme sous-dossier d'un projet :
# Ajouter le dépôt comme remotegit remote add lib-utils https://git.example.com/lib-utils.gitgit fetch lib-utils
# Merger dans un sous-dossiergit merge -s subtree --allow-unrelated-histories lib-utils/mainPour les projets multi-repos, préférez submodules ou subtree.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Conflits récurrents à chaque merge | Branche longue divergente | Activez rerere, mergez main plus souvent |
--squash puis re-merge crée des conflits | Git ne voit pas les commits déjà intégrés | Supprimez la branche après squash, ou utilisez un merge normal |
rerere applique une mauvaise résolution | Résolution enregistrée incorrecte | git rerere forget fichier |
-Xours ne résout pas tout | Conflits de suppression/ajout | Résolvez manuellement avec --ours/--theirs par fichier |
revert -m 1 ne fonctionne pas | Pas un commit de merge | Utilisez git revert SHA sans -m |
À retenir
Section intitulée « À retenir »git merge --abortpour annuler un merge en conflit-Xours/-Xtheirs: résolution automatique en faveur d'un côté (uniquement les conflits)--squash: merger sans commit de merge, historique linéairererere: Git mémorise et rejoue vos résolutions de conflits- Pour les fichiers binaires :
checkout --ours/--theirspar fichier - N'oubliez pas :
-Xours(option) ≠-s ours(stratégie)
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Rechercher dans Git :
git log -Setgit greppour retrouver quand une ligne en conflit est apparue. - Debug : bisect et blame : L'identification du commit qui a introduit la régression révélée par une fusion.
- Plateformes Git : Les garde-fous que les forges ajoutent autour des fusions, revues et branches protégées.