web-dev-qa-db-fra.com

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

Lorsque j'essaie d'extraire le répertoire de mon projet dans le terminal, l'erreur suivante apparaît:

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 "Pull is not possible because you have unmerged files" et comment puis-je le résoudre?

125
Harsukh Makwana

Ce qui se passe actuellement, c’est que vous avez un certain ensemble de fichiers que vous avez déjà essayé de fusionner, mais ils ont engendré des conflits de fusion . Idéalement, si vous obtenez un conflit de fusion, il doit les résoudre manuellement, puis valider le fichier. modifications 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 transféré ses modifications vers le référentiel en amont commun.

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

Pour résoudre ce problème, vous devez résoudre les conflits de fusion en question, puis ajouter et valider les modifications avant de pouvoir effectuer un git pull.

Exemple de reproduction et 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 de 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 sommes dans repo_clone, et si vous faites un git pull, cela créera 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 maintenant plus de commits dans le repo original,

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

Et puis on fait un git pull, on obtient

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'.

Notez que la 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 <file>..." 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é plus tôt.

repo_clone $ vi file

et mettre 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
162
mu 無

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 tirer. Examinez les diagrammes suivants pour mieux visualiser le scénario:

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

Il existe deux options pour faire face à cette situation. Vous pouvez ignorer les modifications apportées à vos fichiers ou les conserver.

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

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

Désormais, lorsque vous tirez, vous pouvez avancer rapidement dans votre branche avec les modifications apportées par le maître. Après avoir tiré, votre branche ressemblerait à maître:

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

Deuxième option: conserver les modifications  
Si vous souhaitez conserver les modifications, vous devez d’abord résoudre 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 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 stockage intermédiaire en tapant git add. La dernière étape consiste à valider votre résultat en tapant git commit -m avec un message approprié. À ce stade, notre diagramme ressemble à ceci:

à distance: A <- B <- C <- D  
local: A <- B <- C '

Ici, j’ai étiqueté le commit que nous venons d’effectuer, car c’est différent du commit C de 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 toutes les deux divergé par rapport à l’ancêtre commun commit B. À ce stade, si vous souhaitez tirer, vous pouvez faire un autre git merge ou git rebase votre branche sur la télécommande. .

Obtenir une maîtrise de Git nécessite de pouvoir comprendre et manipuler des listes chaînées unidirectionnelles. J'espère que cette explication vous incitera à réfléchir dans la bonne direction pour utiliser Git.

32
Tim Biegeleisen

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

vimdiff

Pour supprimer les conflits, vous pouvez utiliser

git mergetool

La commande ci-dessus ouvre en gros un 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 leur utilisation vous permet de choisir les éléments à inclure (ou non) dans le fichier mélangé. Et sauvegardez et quittez le fichier. 

23
Pawan Seerwani

Si vous souhaitez extraire une branche distante à exécuter localement (par exemple à des fins de vérification 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)
5
user5245397

Certains fichiers localement doivent être fusionnés avant de pouvoir extraire. 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
Nick

Si vous ne voulez pas fusionner les modifications et voulez quand même mettre à jour votre adresse locale, lancez la commande.

git reset HEAD —hard

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

3
Santosh

Il y avait le même problème avec moi
Dans mon cas, les étapes sont les suivantes:

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

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Extraire 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 ont respectivement 2 et 1 commits différents.
(use "git pull" to merge the remote branch into yours)
Vous avez des chemins non fusionnés.
(fix conflicts and run "git commit") 

Chemins sans fusion:
(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 toutes les nouvelles modifications -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Commit les changements en 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 -  enter image description here

1
S.Yadav

Lorsqu'un conflit de fusion se produit, vous pouvez ouvrir un fichier individuel. Vous obtiendrez les 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 requise. après cela, enregistrez le fichier puis faites: git add 

Les conflits de fusion seront résolus.

0
dfordevy