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?


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"}

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.


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.


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}

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".


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


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}


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.


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).


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.