Git Pull n'est pas possible, fichiers non fusionnés

89

J'ai lu toutes les questions similaires à ce sujet; il semble qu'aucun des éléments suivants n'a fonctionné:

Delete offending files
git reset --hard HEAD
git stash
git pull

Presque toutes les combinaisons, le stockage des modifications et l'extraction du référentiel, aboutissent à des fichiers non fusionnables. J'aimerais annuler toutes les modifications locales et utiliser simplement la télécommande, mais je ne peux pas cloner à nouveau (limites de bande passante et d'utilisation d'Internet avec le développeur essayant de le faire). Comment puis-je faire cela?

Juste essayé:

git stash
git pull

N'a pas non plus fonctionné.

Plus d'informations

Il y a un commit local, et l'amont a également un commit. J'ai donc essayé git pull --rebasemais ça ne marche toujours pas correctement ... Cela me donne des erreurs - "sortir à cause d'un conflit non résolu". Si je le fais git stash, git reset --hard HEAD, git pull --rebase, j'obtiens l'erreur "pull is not possible, unmerged changes ..."

Christian Stewart
la source

Réponses:

199

Dites que la télécommande est originet la branche est master, et dites que vous avez déjà masterextrait, essayez ce qui suit:

git fetch origin
git reset --hard origin/master

Cela prend simplement la branche actuelle et la pointe vers la HEADbranche distante.

AVERTISSEMENT : comme indiqué dans les commentaires, cela rejettera vos modifications locales et les écrasera avec tout ce qui se trouve à l'origine .

Ou vous pouvez utiliser les commandes de plomberie pour faire essentiellement la même chose:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

EDIT: Je voudrais expliquer brièvement pourquoi cela fonctionne.

Le .gitdossier peut contenir les validations de n'importe quel nombre de référentiels. Puisque le hachage de validation est en fait une méthode de vérification du contenu de la validation, et pas seulement une valeur générée aléatoirement, il est utilisé pour faire correspondre les ensembles de validation entre les référentiels.

Une branche est juste un pointeur nommé vers un hachage donné. Voici un ensemble d'exemples:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

Chacun de ces fichiers contient un hachage pointant vers un commit:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

Ce sont tous pour le mécanisme de stockage interne git et fonctionnent indépendamment du répertoire de travail . En procédant comme suit:

git reset --hard origin/master

git pointera la branche actuelle sur la même valeur de hachage que celle vers laquelle pointe origine / maître. Ensuite, il change de force le répertoire de travail pour qu'il corresponde à la structure / au contenu du fichier à ce hachage.

Pour voir cela au travail, allez-y et essayez ce qui suit:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD
Trevor Norris
la source
2
De la récente modification approuvée ajoutant l'avertissement massif au début, juste comme pour souligner qu'il est déjà mentionné: "Puis [git] change de force le répertoire de travail pour qu'il corresponde à la structure / au contenu du fichier à ce hachage." Mais je suppose que ce n'était pas assez explicite.
Trevor Norris
5

Résolu, à l'aide du jeu de commandes suivant:

git reset --hard
git pull --rebase
git rebase --skip
git pull

L'astuce est de rebaser les modifications ... Nous avons eu du mal à rebaser un commit trivial, et nous l'avons donc simplement ignoré en utilisant git rebase --skip (après avoir copié les fichiers).

Christian Stewart
la source
3

Si jamais vous rencontrez ce problème après avoir exécuté un git fetchet que git ne vous permet pas de l'exécuter en git pullraison d'un conflit de fusion ( fichiers modifiés / non fusionnés , et pour vous rendre plus frustré, il ne vous montrera aucun marqueur de conflit dans le fichier car il n'est pas encore fusionné). Si vous ne souhaitez pas perdre votre travail, vous pouvez faire ce qui suit.

mettre en scène le fichier.

$ git add filename

puis cachez les modifications locales.

$ git stash

extraire et mettre à jour votre répertoire de travail

$ git pull

restaurez votre fichier local modifié (git fusionnera automatiquement s'il le peut, sinon résolvez-le)

$ git stash pop

J'espère que cela aidera.

Nimeshka Srimal
la source
2

Il existe une solution même si vous ne souhaitez pas supprimer vos modifications locales. Corrigez simplement les fichiers non fusionnés (par git addou git remove). Alors fais git pull.

Preeti A.
la source
1

En supposant que vous souhaitiez annuler les modifications que vous avez apportées, vérifiez d'abord la sortie de git status. Pour tout fichier qui indique "non fusionné" à côté, exécutez git add <unmerged file>. Puis continuez avec git reset --hard. Cela supprimera toutes les modifications locales, à l'exception des fichiers non suivis.

Ryan Stewart
la source
Oh, c'est vrai. Il peut ne pas dire «non fusionné». Il pourrait aussi dire «les deux modifiés» ou peut-être une ou deux autres choses. Quel est le résultat git status?
Ryan Stewart
Après avoir posté ceci, je dis au membre de l'équipe d'essayer git rebase --abortet git pull --rebaseselon la suggestion de git
Christian Stewart
1

J'ai été résolu avec git supprimer le fichier non fusionné localement.

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

Quand j'envoie git commit après:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Chetabahana
la source
0

La réponse de Ryan Stewart était presque là. Dans le cas où vous ne souhaitez pas supprimer vos modifications locales, il existe un flux de travail que vous pouvez utiliser pour fusionner:

  • Courez git status. Il vous donnera une liste de fichiers non fusionnés.
  • Fusionnez-les (à la main, etc.)
  • Courir git commit

Git ne validera que les fusions dans un nouveau commit. (Dans mon cas, j'avais des fichiers supplémentaires ajoutés sur le disque, qui n'étaient pas regroupés dans ce commit.)

Git considère alors la fusion comme réussie et vous permet d'avancer.

nightblade9
la source