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?
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
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.
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.
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
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)
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!
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.
Il y avait le même problème avec moi
Dans mon cas, les étapes sont comme ci-dessous-
- 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
- tirer le code du maître
$ git pull origin master
- 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
- ajout de tous les nouveaux changements -
$ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
- Commit les changements sur head -
$ git commit -am "resolved conflict of the app."
- Poussé le code -
$ git push origin master