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?
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
.
# 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
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.
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.
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)
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
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!
Il y avait le même problème avec moi
Dans mon cas, les étapes sont les suivantes:
U project/app/pages/file1/file.ts
U project/www/assets/file1/file-name.html
$ git pull Origin master
$ 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
$ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
$ git commit -am "resolved conflict of the app."
$ git Push Origin master
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.