Utilisation de git pull
avec l'option --ignore-unmerged
Maintenant que nous avons créé un conflit entre nos dépôts local et distant, explorons comment utiliser l'option git pull --ignore-unmerged
pour le résoudre.
Comprendre l'option --ignore-unmerged
L'option --ignore-unmerged
indique à Git de prioriser les modifications distantes par rapport à vos modifications locales lorsqu'il y a des conflits. Cela peut être utile dans les situations où vous savez que les modifications distantes sont plus importantes que vos modifications locales.
Annuler la fusion en cours
Avant de pouvoir utiliser l'option --ignore-unmerged
, nous devons annuler la fusion en cours :
cd ~/project/git-pull-demo
git merge --abort
Cette commande restaurera votre répertoire de travail à l'état qu'il avait avant la tentative de fusion. Vérifions le contenu du fichier :
cat file1.txt
Vous devriez maintenant voir seulement vos modifications locales :
This is the first line of the file.
This line was added locally.
Utilisation de l'option --ignore-unmerged
Maintenant, utilisons l'option git pull --ignore-unmerged
:
git pull --ignore-unmerged origin main
Vous pourriez remarquer que Git signale toujours un conflit :
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
C'est parce que l'option --ignore-unmerged
fonctionne un peu différemment de ce que son nom laisse supposer. Elle ne résout pas directement les conflits en ignorant vos modifications locales. Au lieu de cela, elle permet à Git de poursuivre une fusion même lorsqu'il y a des entrées non fusionnées.
Comprendre ce qui s'est réellement passé
La bonne façon de prioriser les modifications distantes par rapport aux modifications locales est d'utiliser l'option --strategy-option theirs
:
git reset --hard ## Attention : cela supprimera toutes les modifications non validées
git pull -X theirs origin main
La sortie devrait ressembler à ceci :
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Updating xxxxxxx..xxxxxxx
Fast-forward
file1.txt | 1 +
1 file changed, 1 insertion(+)
Cette commande indique à Git de résoudre automatiquement les conflits en préférant les modifications distantes ("theirs") par rapport à vos modifications locales ("ours").
Vérifions le contenu du fichier maintenant :
cat file1.txt
Vous devriez voir :
This is the first line of the file.
This line was added by a team member.
Comme vous pouvez le voir, la modification distante a été priorisée par rapport à votre modification locale. L'option --strategy-option theirs
est un moyen plus direct d'obtenir ce que beaucoup de personnes croient incorrectement que --ignore-unmerged
fait.
Quand utiliser --ignore-unmerged
L'option --ignore-unmerged
est en fait plus utile dans les cas où vous souhaitez tirer (pull) les mises à jour pour les fichiers qui n'ont pas de conflits, tout en laissant les fichiers conflictuels non fusionnés pour une résolution manuelle ultérieure.
Pour démontrer cela correctement, créons un autre scénario :
## Ajouter un nouveau fichier localement
echo "This is a new local file." > local_file.txt
git add local_file.txt
git commit -m "Added local_file.txt"
## Créer une modification dans le dépôt du membre de l'équipe
cd ~/project/team-member-repo
echo "This is a second line by team member." >> file1.txt
echo "This is a new remote file." > remote_file.txt
git add file1.txt remote_file.txt
git commit -m "Team member made more changes"
git push origin main
## Revenir à votre dépôt
cd ~/project/git-pull-demo
## Apporter une modification différente au fichier file1.txt
echo "This is another local change." >> file1.txt
git add file1.txt
git commit -m "Made another local change"
Maintenant, lorsque vous essayez de tirer les modifications, vous obtiendrez un conflit :
git pull origin main
Sortie :
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
Annulons la fusion et essayons avec --ignore-unmerged
:
git merge --abort
git pull --ignore-unmerged origin main
Cela peut toujours afficher des conflits, mais cela vous permettra d'obtenir toutes les modifications non conflictuelles (comme remote_file.txt
) tout en laissant le fichier conflictuel (file1.txt
) à résoudre manuellement.