Pourquoi git dit-il "Pull n'est pas possible parce que vous avez des fichiers non fusionnés"?

Lorsque j'essaie de tirer dans 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 <file>'
as appropriate to mark resolution, or use 'git commit -a'.

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

112
demandé sur mu 無 2014-10-15 11:28:00

9 réponses

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 vomi des conflits de fusion. Idéalement, si l'on obtient un conflit de fusion, il devrait les résoudre manuellement et valider les modifications en utilisant git add file.name && git commit -m "removed merge conflicts". Maintenant, un autre utilisateur a mis à jour les fichiers en question sur son référentiel, et a poussé ses modifications au repo en amont commun.

Il se trouve que vos conflits de fusion de (probablement) le dernier commit n'ont pas été résolus, donc vos fichiers ne sont pas fusionnés tout droit, et donc le U(unmerged) drapeau pour les fichiers. Alors maintenant, quand vous faites un git pull, git vomit l'erreur, parce que 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, ajouter et valider les modifications, avant de pouvoir faire un 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, créons le référentiel structure

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 sommes dans repo_clone, et si vous faites un git pull, il en sortira 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 repo d'origine maintenant,

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

, 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 <file>'
as appropriate to mark resolution, or use 'git commit -a'.

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

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 <file>..." to mark resolution)

        both modified:      file

Donc, pour résoudre ce problème, nous devons d'abord résoudre le conflit de fusion nous avons ignoré plus tôt

repo_clone $ vi file

Et définit son contenu sur

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
145
répondu mu 無 2014-11-29 03:07:36

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

Distance: A
local: A
(*indique que vous avez plusieurs fichiers qui ont été modifiés mais non validés.)

Il y a deux options pour faire face à cette situation. Vous pouvez supprimez les modifications de vos fichiers Ou conservez-les.

Première Option: jeter 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 branche à HEAD. Par ailleurs, la tête dans votre branche locale est B, sans astérisque. Si vous choisissez cette option, le diagramme devient:

Distance: A
local: A

Maintenant, quand vous tirez, vous pouvez avancer rapidement votre branche avec les changements de maître. Après avoir tiré, votre branche ressemblerait à master:

Local: A

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

// votre version du code
=======
// le 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 branche 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 ainsi que les marqueurs), vous pouvez ajouter chaque fichier à votre zone de transit en tapant git add. La dernière étape consiste à valider votre résultat en tapant git commit -m, avec une message. À ce stade, notre diagramme ressemble à ceci:

Distance: A
local: A

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 lire les modifications dans remote sur votre branche, car votre branche et la télécommande ont divergé de l'ancêtre commun commit B. à ce stade, si vous voulez tirer, vous pouvez soit faire un autre git merge, ou git rebase votre branche sur la télécommande.

Pour maîtriser Git, il faut être capable de comprendre et de manipuler des listes liées unidirectionnelles. J'espère que cette explication vous fera penser dans la bonne direction à l'utilisation de Git.

32
répondu Tim Biegeleisen 2014-12-01 11:36:49

Il y a une solution simple à cela. Mais pour cela, vous devrez d'abord apprendre la suite

vimdiff

Pour supprimer les conflits, vous pouvez utiliser

git mergetool

La commande ci-dessus ouvre essentiellement fichier local, fichier mixte, 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 ce qu'il faut inclure (ou non) dans le fichier mixte. Et il suffit d'enregistrer et de quitter le fichier.

20
répondu Pawan Seerwani 2014-12-03 19:04:08

Vous avez des fichiers localement qui doivent être fusionnées avant de pouvoir tirer. 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
5
répondu Nick 2014-11-29 13:08:12

Si vous souhaitez supprimer une branche 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)
3
répondu user5245397 2016-08-03 16:25:44

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

git reset HEAD —hard

Cela réinitialisera votre local avec HEAD, puis tirez votre télécommande en utilisant git pull!

1
répondu Santosh 2016-07-11 12:51:06

En cas de conflit de fusion, vous pouvez ouvrir un fichier individuel. Vous obtiendrez ">>>>>>" symboles. Ceux-ci se réfèrent à vos modifications et aux modifications présentes sur la télécommande. Vous pouvez modifier manuellement la partie requise. après cela enregistrez le fichier puis faites : git ajouter

Les conflits de fusion seront résolus.

0
répondu dfordevy 2016-02-11 09:44:58

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

  1. Supprimé tous les fichiers qui était en train de commencer avec U (désinstallé) symbole. as -

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

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

 $ git status

Voici le message qu'Il est apparu-
et avoir 2 et 1 commit différent chacun, respectivement.
(use "git pull" to merge the remote branch into yours)
Vous avez désinstallé chemin.
(fix conflicts and run "git commit")

Chemins non fusionnés:
(utilisez " git ajouter ..."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. Commit les changements sur head -

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

$ git push origin master

Quel tour peut Problème résolu avec cette image - entrez la description de l'image ici

0
répondu S.Yadav 2017-05-10 07:30:13

Exécutez simplement cette commande:

git reset --hard
-1
répondu Grace Green 2018-03-14 14:11:00