Annuler git pull, comment ramener les dépôts à leur ancien état

1006

Existe-t-il un moyen de rétablir ou d'annuler git pull pour que ma source / repos revienne à son état antérieur à celui de git pull? Je veux le faire parce qu'il a fusionné certains fichiers que je ne voulais pas faire, mais seulement fusionner les autres fichiers restants. Donc, je veux récupérer ces fichiers, est-ce possible?

EDIT: Je veux annuler git merge pour clarification. Après avoir vu quelques réponses, je l'ai fait

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Maintenant, que dois-je faire? Ça git reset --hard va? Je ne veux pas le visser à nouveau, donc demander des étapes détaillées?

seg.server.fault
la source
23
Il semble que vous n'ayez que deux choses dans votre histoire: un clone et une extraction. Réinitialisez simplement le clone: git reset --hard 01b34fadans ce cas, vous auriez pu effectuer la git reset --hard HEAD^réinitialisation d'un commit avant le HEAD.
jkp
2
--hard est nécessaire si vous souhaitez modifier des fichiers dans votre répertoire de travail
William Pursell
3
@ seg.server.fault: si cela a fonctionné, vous pouvez toujours accepter la réponse;)
jkp
7
git reset --hard HEAD ^
funroll
7
git reflogmontrera tout ce qui a été fait avec git. Il y a une préoccupation qui git reset --hard [sha1 of something from reflog]inversera tout ce qui est montré dans reflog, ce qui n'est parfois pas un objectif, par exemple. vous souhaitez annuler la fusion sur la branche principale extraite de l'origine avec des données incorrectes (se produit), et après cette fusion, vous avez travaillé sur d'autres branches. reflogaffichera chaque chage sur d'autres branches. Mais git checkout masteret git reset --hard [SH1 of commit on master branch just before merge]ne réinitialisera que la branche principale actuelle supprimant la fusion extraite de l'origine.
Vladimir Vukanac

Réponses:

1427

L'exécution git pullexécute les tâches suivantes, dans l'ordre:

  1. git fetch
  2. git merge

L'étape de fusion combine les branches qui ont été configurées pour être fusionnées dans votre configuration. Vous voulez annuler l' étape de fusion , mais probablement pas la récupération (cela n'a pas beaucoup de sens et ne devrait pas être nécessaire).

Pour annuler la fusion , utilisez git reset --hardpour réinitialiser le référentiel local à un état précédent; utilisez git-reflog pour trouver le SHA-1 de l'état précédent, puis réinitialisez-le.

Attention

Les commandes répertoriées dans cette section suppriment toutes les modifications non validées, entraînant potentiellement une perte de travail:

git reset --hard

Vous pouvez également réinitialiser à un moment particulier, tel que:

git reset --hard master@{"10 minutes ago"}
jkp
la source
325
Une excellente façon de choisir l'état précédent, au lieu d'utiliser git-reflog et la copie hash, est d'utiliser un raccourci comme master@{1}, qui est la position précédente master, master@{"5 minutes ago"}ou master@{14:30}. Tous les détails sur la spécification des révisions de cette manière peuvent être trouvés dans man git-rev-parse, dans la section intitulée "spécification des révisions".
Cascabel
38
Dans ce cas, ORIG_HEAD devrait également fonctionner ("git reset --hard ORIG_HEAD")
Jakub Narębski
@Jelfromi: merci pour cette astuce, je ne savais pas que vous pouviez être aussi bavard sur les révisions. Je savais choisir des révisions par rapport à HEAD, mais quand la question a été posée, je ne savais pas jusqu'où il voulait aller.
jkp
Quand j'ai tiré, ça dit Updating d2c90a3..035ac4d. Ici, vous pouvez également utiliser d2c90a3comme paramètre pour réinitialiser.
Thai
Vous n'avez pas besoin de taper des hachages lorsque vous utilisez reflog. Vous pouvez également utiliser HEAD @ {1} ou le numéro précédent tel que défini dans le reflog.
Simon The Cat
338

Identique à la réponse de jkp, mais voici la commande complète:

git reset --hard a0d3fe6

où a0d3fe6 est trouvé en faisant

git reflog

et en regardant le point auquel vous souhaitez annuler.

Jeffrey Sun
la source
Pourquoi ne puis-je pas le faire git reset HEAD --hard, par exemple?
Sung Cho
9
@MikeC Cette approche vous permet de revenir en arrière plusieurs fois, par exemple
xji
2
Je n'ai pas pu utiliser les identifiants du côté gauche mais j'ai git reset --hard HEAD@{n}travaillé
E. Sundin
1
Vous auriez dû suggérer une modification de la réponse de jkp au lieu de presque la reproduire ici après tant d'années.
Abhishek Anand
Si je l'ai sur git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} et bbbbbbb HEAD @ {2}. Si je le fais, git reset --hard bbbbbbbje perdrai les HEAD 0 et 1?
pmiranda
115

Une façon plus moderne d'annuler une fusion est la suivante:

git merge --abort

Et la façon un peu plus ancienne:

git reset --merge

La méthode à l'ancienne décrite dans les réponses précédentes (avertissement: supprimera toutes vos modifications locales):

git reset --hard

Mais en fait, il convient de noter que ce git merge --abortn'est que l'équivalent de ce git reset --mergequi MERGE_HEADest présent. Cela peut être lu dans la commande git help for merge.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Après une fusion qui a échoué, quand il n'y en a pas MERGE_HEAD, la fusion qui a échoué peut être annulée git reset --mergemais pas nécessairement avec git merge --abort, donc ils ne sont pas seulement une ancienne et une nouvelle syntaxe pour la même chose . C'est pourquoi je trouve git reset --mergeêtre beaucoup plus utile dans le travail quotidien.

Martin G
la source
20
git merge --abortfonctionne PENDANT une fusion, pas après la git pullfin. Cette réponse ne semble donc pas pertinente pour la question.
Abhishek Anand
1
git reset --mergesupprime toutes les modifications non mises en scène pour la validation. J'ai découvert ça à la dure.
theadriangreen
62

cela fonctionne première utilisation: git reflog

trouver votre SHA de votre état précédent et faire (HEAD @ {1} est un exemple)

git reset --hard HEAD@{1}
Ezequiel García
la source
40

Si vous avez gitk (essayez d'exécuter "gitk --all depuis votre ligne de commande git"), c'est simple. Il suffit de l'exécuter, sélectionnez le commit que vous souhaitez restaurer (clic droit) et sélectionnez "Réinitialiser la branche principale ici". Si vous n'avez aucune modification non validée, choisissez l'option "hard".

Samuel Carrijo
la source
8
Cela vaut la peine d'être exécuté si vous ne l'avez pas vu. Il affiche une interface graphique folle.
Evan Moran
35

Supposons que ce $COMMITsoit le dernier ID de validation avant que vous ayez effectué git pull. Ce dont vous avez besoin pour annuler la dernière traction est

git reset --hard $COMMIT

.

Prime:

En parlant de pull, je voudrais partager une astuce intéressante,

git pull --rebase

Cette commande ci-dessus est la commande la plus utile de ma vie git qui a permis de gagner beaucoup de temps.

Avant de pousser votre nouveau commit sur le serveur, essayez cette commande et elle synchronisera automatiquement les dernières modifications du serveur (avec fetch + merge) et placera votre commit en haut dans git log. Pas besoin de vous soucier de l'extraction / fusion manuelle.

Plus de détails sur: http://gitolite.com/git-pull--rebase

Sazzad Hissain Khan
la source
17

Il s'agit de la manière la plus simple d'annuler les modifications.

** Warning **

Veuillez sauvegarder vos fichiers modifiés car cela supprimera les fichiers et dossiers nouvellement créés .

git reset --hard 9573e3e0

9573e3e0est votre {ID de validation}

Manish Goswami
la source
cette réponse est très utile, parce que si nous faisons une branche d'origine git pull wi obtenir quelque chose comme ça Updating ffce65bd..e929e884, le fairegit reset --hard ffce65bd
Ernesto Alfonso
15

tu peux faire git reset --hard ORIG_HEAD

depuis "pull" ou "merge", définissez ORIG_HEAD comme étant l'état actuel avant de faire ces actions.

Orlando
la source
5

git pull do ci-dessous opération.

je. git fetch

ii. git merge

Pour annuler l'extraction, effectuez une opération:

je. git reset --hard --- c'est aussi annuler tout changement local

ou

ii. git reset --hard master@{5.days.ago} (comme 10.minutes.ago, 1.hours.ago, 1.days.ago..) pour obtenir des changements locaux.

ou

iii. git reset --hard commitid

Amélioration:

La prochaine fois, utilisez git pull --rebaseau lieu de git pull.. son serveur de synchronisation changera en faisant (chercher et fusionner).

GolamMazid Sajib
la source
4

S'il y a échec d'une fusion, qui est la raison la plus courante pour vouloir annuler une git pull, l'exécution git reset --mergefait exactement ce à quoi on peut s'attendre: conserver les fichiers récupérés, mais annuler la fusion qui a git pulltenté de fusionner. Ensuite, on peut décider quoi faire sans l'encombrement qui git mergese produit parfois. Et il n'en a pas besoin pour trouver l'ID de validation exact --hardmentionné dans toutes les autres réponses.

Davide
la source