101 votes

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

J'ai lu toutes les questions similaires sur ce sujet ; il semble qu'aucune des solutions suivantes n'ait fonctionné :

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

Presque toutes les combinaisons, en stockant les changements et en tirant du dépôt, donnent des fichiers impossibles à fusionner. J'aimerais supprimer toutes les modifications locales et n'utiliser que le dépôt distant, mais je ne peux pas cloner à nouveau (limitations de la bande passante et de l'utilisation d'Internet avec le développeur qui essaie de le faire). Comment dois-je procéder ?

Je viens d'essayer :

git stash
git pull

Il 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 --rebase mais ça ne fonctionne toujours pas correctement... Cela me donne des erreurs - "exiting because of an unresolved conflict". Si je fais git stash, git reset --hard HEAD, git pull --rebase Je reçois l'erreur "pull is not possible, unmerged changes...".

222voto

Trev Norris Points 2686

Disons que la télécommande est origin et la branche est master et dites que vous avez déjà master vérifié, vous pouvez essayer ce qui suit :

git fetch origin
git reset --hard origin/master

Cela prend simplement la branche courante et la dirige vers le fichier HEAD de la branche distante.

AVERTISSEMENT : Comme indiqué dans les commentaires, ceci jettera vos changements locaux y écraser avec ce qui se trouve sur 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 : J'aimerais expliquer brièvement pourquoi cela fonctionne.

En .git peut contenir les commits d'un nombre quelconque de dépôts. Puisque le hachage du commit est en fait une méthode de vérification du contenu du commit, et pas seulement une valeur générée aléatoirement, il est utilisé pour faire correspondre les ensembles de commit entre les dépôts.

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

$ 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 hash pointant vers un commit :

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

Ceux-ci sont tous destinés au mécanisme de stockage interne de git, et fonctionnent indépendamment de la fonction répertoire de travail . En faisant ce qui suit :

git reset --hard origin/master

git fera pointer la branche courante vers la même valeur de hachage que celle vers laquelle origin/master pointe. Ensuite, il change de force le répertoire de travail pour qu'il corresponde à la structure/contenu des fichiers de ce hachage.

Pour voir comment cela fonctionne, 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

7voto

Tayler Points 434

J'ai eu de la chance avec

git checkout -f <branch>

dans une situation similaire.

http://www.kernel.org/pub//software/scm/git/docs/git-checkout.html

Annuler la suppression dans GIT

7voto

Christian Stewart Points 5729

Résolu, en utilisant le jeu de commandes suivant :

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

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

5voto

user3571366 Points 79

Si jamais vous rencontrez ce problème après avoir exécuté une git fetch et alors git ne vous permet pas d'exécuter git pull en raison d'un conflit de fusion ( les deux fichiers modifiés / non fusionnés En outre, pour vous frustrer davantage, il ne vous montrera aucun marqueur de conflit dans le fichier puisqu'il n'a pas encore été fusionné.) Si vous ne souhaitez pas perdre votre travail, vous pouvez procéder comme suit.

mettre en scène le fichier.

$ git add filename

puis cachez les changements locaux.

$ git stash

tirer et mettre à jour votre répertoire de travail

$ git pull

restaurer votre fichier local modifié (git va automatiquement fusionner s'il le peut, sinon le résoudre)

$ git stash pop

J'espère que cela vous aidera.

2voto

Preeti A. Points 136

Il existe une solution même si vous ne souhaitez pas supprimer vos modifications locales. Corrigez simplement les fichiers non fusionnés (par git add o git remove ). Ensuite, faites git pull .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X