Pourquoi git dit “Pull n’est pas possible parce que vous avez des fichiers non fusionnés”?

Lorsque j’essaie de récupérer mon répertoire de projet dans le terminal, je vois l’erreur suivante:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master U app/config/app.php U app/config/database.php U app/routes.php Pull is not possible because you have unmerged files. Please, fix them up in the work tree, and then use 'git add/rm ' as appropriate to mark resolution, or use 'git commit -a'. 

Pourquoi git dit "Pull is not possible because you have unmerged files" , et comment puis-je le résoudre?

Ce qui se passe actuellement, c’est que vous avez un certain ensemble de fichiers, que vous avez essayé de fusionner plus tôt, mais ils ont créé des conflits de fusion. Idéalement, si un conflit de fusion survient, il devrait les résoudre manuellement et valider les modifications à l’aide de git add file.name && git commit -m "removed merge conflicts" . Désormais, un autre utilisateur a mis à jour les fichiers en question sur son référentiel et a poussé ses modifications vers le référentiel commun en amont.

Il se trouve que vos conflits de fusion de (probablement) la dernière validation n’ont pas été résolus, vos fichiers ne sont donc pas tous fusionnés, et donc l’ unmerged U (non unmerged ) pour les fichiers. Alors maintenant, quand vous faites un git pull , git lance l’erreur, car vous avez une version du fichier, qui n’est pas correctement résolue.

Pour résoudre ce problème, vous devrez résoudre les conflits de fusion en question et append et valider les modifications avant de pouvoir effectuer une git pull .

Exemple de reproduction et de résolution du problème:

 # Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params` Desktop $ cd test 

Tout d’abord, laissez-nous créer la structure du référentiel

 test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg" repo $ cd .. && git clone repo repo_clone && cd repo_clone repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone 

Maintenant, nous sums dans repo_clone, et si vous faites un git pull , cela va créer des conflits

 repo_clone $ git pull origin master remote: Counting objects: 5, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From /home/anshulgoyal/Desktop/test/test/repo * branch master -> FETCH_HEAD 24d5b2e..1a1aa70 master -> origin/master Auto-merging file CONFLICT (content): Merge conflict in file Automatic merge failed; fix conflicts and then commit the result. 

Si nous ignorons les conflits dans le clone, et faisons plus de commits dans le repository initial maintenant,

 repo_clone $ cd ../repo repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone 

Et puis nous faisons un git pull , nous obtenons

 repo_clone $ git pull U file Pull is not possible because you have unmerged files. Please, fix them up in the work tree, and then use 'git add/rm ' as appropriate to mark resolution, or use 'git commit -a'. 

Notez que le file est maintenant dans un état non fusionné et si nous faisons un git status , nous pouvons clairement voir la même chose:

 repo_clone $ git status On branch master Your branch and 'origin/master' have diverged, and have 1 and 1 different commit each, respectively. (use "git pull" to merge the remote branch into yours) You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add ..." to mark resolution) both modified: file 

Donc, pour résoudre ce problème, nous devons d’abord résoudre le conflit de fusion que nous avons ignoré précédemment

 repo_clone $ vi file 

et définir son contenu à

 text2 text1 text1 

puis ajoutez-le et validez les modifications

 repo_clone $ git add file && git commit -m "resolved merge conflicts" [master 39c3ba1] resolved merge conflicts 

Vous essayez d’append un nouveau commit dans votre twig locale alors que votre répertoire de travail n’est pas propre. En conséquence, Git refuse de faire le pull. Considérez les diagrammes suivants pour mieux visualiser le scénario:

distant: A <- B <- C <- D
local: A <- B *
(* indique que vous avez plusieurs fichiers modifiés mais non validés.)

Il existe deux options pour faire face à cette situation. Vous pouvez soit ignorer les modifications apscopes à vos fichiers, soit les conserver.

Option 1: Jetez les changements
Vous pouvez soit utiliser git checkout pour chaque fichier non fusionné, soit utiliser git reset --hard HEAD pour réinitialiser tous les fichiers de votre twig sur HEAD. Au fait, HEAD dans votre twig locale est B, sans astérisque. Si vous choisissez cette option, le diagramme devient:

distant: A <- B <- C <- D
local: A <- B

Maintenant, lorsque vous tirez, vous pouvez avancer rapidement votre twig avec les modifications de maître. Après avoir tiré, votre twig ressemblerait à un maître:

local: A <- B <- C <- D

Option deux: conserver les modifications
Si vous souhaitez conserver les modifications, vous devez d’abord résoudre tous les conflits de fusion dans chacun des fichiers. Vous pouvez ouvrir chaque fichier dans votre IDE et rechercher les symboles suivants:

<<<<<<< HEAD
// votre version du code
=======
// la version du code de la télécommande
>>>>>>>

Git vous présente deux versions de code. Le code contenu dans les marqueurs HEAD est la version de votre succursale locale actuelle. L’autre version est ce qui vient de la télécommande. Une fois que vous avez choisi une version du code (et supprimé l’autre code avec les marqueurs), vous pouvez append chaque fichier à votre zone de transit en tapant git add . L’étape finale consiste à valider votre résultat en tapant git commit -m avec un message approprié. À ce stade, notre diagramme ressemble à ceci:

distant: A <- B <- C <- D
local: A <- B <- C '

Ici, j’ai étiqueté le commit que nous venons de faire comme C ‘car il est différent du commit C sur la télécommande. Maintenant, si vous essayez de tirer, vous obtiendrez une erreur d’avance non rapide. Git ne peut pas jouer les changements dans remote sur votre twig, car votre twig et la télécommande ont divergé de la commettre ancêtre commune B. À ce stade, si vous voulez tirer, vous pouvez soit faire une nouvelle git merge , la télécommande.

Pour maîsortingser Git, il faut pouvoir comprendre et manipuler des listes chaînées unidirectionnelles. J’espère que cette explication vous fera réfléchir dans la bonne direction concernant l’utilisation de Git.

Theres une solution simple à cela. Mais pour cela, vous devrez d’abord apprendre ce qui suit

 vimdiff 

Pour supprimer les confits, vous pouvez utiliser

 git mergetool 

La commande ci-dessus ouvre essentiellement le fichier local, le fichier mixte, le fichier distant (3 fichiers au total), pour chaque fichier en conflit. Les fichiers locaux et distants sont juste pour votre référence, et en les utilisant, vous pouvez choisir quoi inclure (ou non) dans le fichier mixte. Et juste enregistrer et quitter le fichier.

Certains fichiers locaux doivent être fusionnés avant de pouvoir être extraits. Vous pouvez extraire les fichiers, puis tirer pour écraser vos fichiers locaux.

 git checkout app/config/app.php app/config/database.php app/routes.php git pull origin master 

Si vous souhaitez extraire une twig distante pour l’exécuter localement (par exemple à des fins de révision ou de test), et lorsque vous $ git pull vous obtenez des conflits de fusion locaux:

 $ git checkout REMOTE-BRANCH $ git pull (you get local merge conflicts) $ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD) $ git pull (now get remote branch updates without local conflicts) 

Si vous ne souhaitez pas fusionner les modifications et que vous souhaitez toujours mettre à jour votre fichier local, optez pour la commande.

 git reset HEAD —hard 

Cela va réinitialiser votre local avec HEAD et ensuite tirer votre télécommande en utilisant git pull!

Lorsqu’un conflit de fusion se produit, vous pouvez ouvrir un fichier individuel. Vous obtiendrez des symboles “<<<<<<< ou >>>>>>>”. Celles-ci font référence à vos modifications et aux modifications présentes sur la télécommande. Vous pouvez modifier manuellement la pièce requirejse. Après cela, sauvegardez le fichier et faites ensuite: git add

Les conflits de fusion seront résolus.

Il y avait le même problème avec moi
Dans mon cas, les étapes sont comme ci-dessous-

  1. Suppression de tous les fichiers en cours de démarrage avec le symbole U (non fusionné). comme-

 U project/app/pages/file1/file.ts U project/www/assets/file1/file-name.html 
  1. Tirez le code du maître

 $ git pull origin master 
  1. Vérifié pour le statut

  $ git status 

Voici le message qui est apparu –
et avoir 2 et 1 engagement différent chacun, respectivement.
(use "git pull" to merge the remote branch into yours)
Vous avez des chemins non combinés.
(fix conflicts and run "git commit")

Chemins non fusionnés:
(utilisez “git add …” pour marquer la résolution)

 both modified: project/app/pages/file1/file.ts both modified: project/www/assets/file1/file-name.html 
  1. Ajout de tous les nouveaux changements –

  $ git add project/app/pages/file1/file.ts project/www/assets/file1/file-name.html 
  1. Engager des changements sur la tête

 $ git commit -am "resolved conflict of the app." 
  1. Poussé le code –

 $ git push origin master 

Quel tour peut être résolu avec cette image – entrer la description de l'image ici

Il suffit de lancer cette commande:

 git reset --hard