|
|
Un conflit se produit si depuis le dernier commit, 2 développeurs modifient le même fichier à la même ligne ou si un développeur modifie un fichier qu'un autre développeur supprime.
|
|
|
Dans ce cas, le processus de 'merge' renvoit l'erreur suivante :
|
|
|
|
|
|
```bash
|
|
|
Auto-merging fichier-conflit.txt
|
|
|
CONFLICT (content): Merge conflict in fichier-conflit.txt
|
|
|
Automatic merge failed; fix conflicts and then commit the result.
|
|
|
```
|
|
|
|
|
|
Le conflit n'affecte que le développeur qui réalise la fusion, les autres développeurs ne le voient pas. Git marque alors le fichier conflictuel comme étant en conflit et suspend le processus de 'merge' tant que le conflit n'est pas résolu.
|
|
|
Dans cet exemple, on fusionne une branche 'develop' à une branche 'master' (`git merge develop`) où on se situe et c'est le fichier 'fichier-conflit.txt' qui pose problème.
|
|
|
|
|
|
En effet, le contenu du fichier `fichier-conflit.txt` est :
|
|
|
- '*ligne 1 pour un conflit*' sur la branche 'master' où on se situe (position du pointeur HEAD)
|
|
|
- '*on essaye le conflit*' sur la branche 'develop' qu'on souhaite fusionner à la branche 'master'
|
|
|
|
|
|
Quand on ouvre ce fichier `fichier-conflit.txt` avec un éditeur de texte dans la branche courante, Git y a introduit des commentaires :
|
|
|
|
|
|
```bash
|
|
|
<<<<<<< HEAD
|
|
|
ligne 1 pour un conflit
|
|
|
=======
|
|
|
on essaye le conflit
|
|
|
>>>>>>> develop
|
|
|
```
|
|
|
|
|
|
- Entre `<<<<<<< HEAD` et `=======` se situe la ligne du fichier qui pose problème dans la branche 'master' où se situe le pointeur HEAD (donc où on est)
|
|
|
- Entre `=======` et `>>>>>>> develop` se situe la ligne du fichier qui pose problème dans la branche 'develop'
|
|
|
|
|
|
Il n'y a plus qu'à effacer ces commentaires et choisir la ligne qu'on veur garder. Voici le nouveau contenu du fichier `fichier-conflit.txt` (on a gardé le contenu présent dans la branche master):
|
|
|
```bash
|
|
|
ligne 1 pour un conflit
|
|
|
```
|
|
|
|
|
|
Le fichier doit être sauvegardé avec un éditeur de texte, puis ajouté dans la zone d'indexation (`git add fichier-confli.txt`) et validé (`git commit -m 'Resolution conflit'`).
|
|
|
La fusion se termine automatiquement : si on refait `git merge develop`, il apparaît 'everything up-to-date'.
|
|
|
Si on visualise l'historique avec la commande `git log --graph --decorate --oneline --all --color` ou en allant dans l'onglet `Repository -> Visualize all Branch history`, on apperçoit qu'un nouveau commit est créé, il s'agit d'un 'commit de merge' qui correspond à la fusion des 2 branches. |