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 --abortRetour à l’état exact d’avant le git merge. Aucune modification
n’est perdue.
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 REsolution” — 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)