Comment annuler un git pull?

238

Je voudrais annuler mon pull git en raison de commits indésirables sur l'origine distante, mais je ne sais pas à quelle révision je dois réinitialiser.

Comment puis-je simplement revenir à l'état avant de faire le git tirer sur l'origine distante?

Kartins
la source
4
Note de côté: vous pouvez trouver utile de git fetch upstreamcommencer, puis jetez un coup d'œil git diff upstream/branchpour voir dans quoi vous allez fusionner. Si tout va bien, alors continuezgit merge upstream/branch
Shahbaz
1
Vous perdrez tout votre crédit de rue et serez ancré dans le salaire d'une semaine si un brogrammeur hipster vous voit exécuter des commandes git à partir d'une interface graphique, mais GitHub Desktop et Atom ont des boutons sûrs et simples pour les undovalidations et des cases à cocher pour facilement et clairement mettre en scène et supprimer les fichiers. Les GUI sont aussi des gens!
Dem Pilafian

Réponses:

391

Ou pour le rendre plus explicite que l'autre réponse:

git pull 

whoops?

git reset --keep HEAD@{1}

Les versions de git antérieures à 1.7.1 n'en ont pas --keep. Si vous utilisez une telle version, vous pouvez l'utiliser --hard- mais c'est une opération dangereuse car elle perd toute modification locale.


Au commentateur

ORIG_HEAD est un état antérieur de HEAD, défini par des commandes qui ont un comportement éventuellement dangereux, pour être facile à les rétablir. Il est moins utile maintenant que Git a reflog: HEAD @ {1} est à peu près équivalent à ORIG_HEAD (HEAD @ {1} est toujours la dernière valeur de HEAD, ORIG_HEAD est la dernière valeur de HEAD avant une opération dangereuse)

sehe
la source
2
quelle est la différence entre HEAD @ {1} et HEAD ^?
hugemeow
7
@hugemeow Ce serait une belle question SO. Pendant man git-rev-parsece temps, décrit cela. HEAD@{1}est la valeur précédente de symbolique HEADdans le reflogalors que HEAD^est la (première) révision parent du courant HEAD. Ces deux éléments doivent être équivalents (par exemple, après un rebase, une réinitialisation matérielle, un commutateur de branche, etc.). Lisez l'article lié pour reflog. Vive
sehe
10
Utilisateurs de PowerShell, échappez aux crochets avec un backtick:git reset HEAD@`{1`}
Robert Claypool
3
ss64.com/ps/syntax-esc.html~~V~~singular~~1st Je pense que vous avez voulu taper HEAD@`{1`}, ou pour qui comptent vraiment ce qui fonctionne sur des coquilles trop POSIX:'HEAD@{1}'
sehe
2
Je pense que cela réinitialise non seulement la traction, mais aussi mes commits = (
falsarella
67

git reflog showdevrait vous montrer l'histoire de HEAD. Vous pouvez l'utiliser pour déterminer où vous vous trouviez avant le pull. Ensuite, vous pouvez resetvous HEADy engager.

Noufal Ibrahim
la source
git reflog show a donné cette sortie: c9e5e4d HEAD @ {0}: pull: avance rapide 1c86a22 HEAD @ {1}: pull origine master: avance rapide 05c141a HEAD @ {2}: pull: avance rapide Puis-je réinitialiser le HEAD to HEAD en toute sécurité @ {1}
Kartins
L'autre réponse de sehe contient des détails sur la façon d'y arriver.
Noufal Ibrahim
Cela a été super utile après un commit désastreux d'une manière ou d'une autre entrecoupée de fusions dans mon histoire. Sortez-les en cherchant un dernier bien connu dans le reflog puis forcez de pousser.
Domenic
Et si pullc'est la première action? Si pullest à HEAD@{1}, et rien d'autre avant cela, comment revenez-vous à un état avant cela?
Hendra Uzia
Recréer le référentiel?
Noufal Ibrahim
29

Cela a fonctionné pour moi.

git reset --hard ORIG_HEAD 

Annuler une fusion ou une extraction:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

Découvrez ceci: HEAD et ORIG_HEAD dans Git pour en savoir plus.

Parag Tyagi
la source
17

Trouvez le <SHA#>pour le commit que vous voulez faire. Vous pouvez le trouver dans github ou en tapant git logou git reflog showsur la ligne de commande, puis faites git reset --hard <SHA#>

Nina
la source
Trouvez quoi pour le commit?
Martin
Désolé, j'ai corrigé cela<SHA#>
Nina
C'est la commande que j'utilise le plus quand je dois annuler quelque chose
Kartins
2

Depuis https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree

Annuler une fusion ou tirer à l'intérieur d'un arbre de travail sale

$ git pull           (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol               |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)

Même si vous pouvez avoir des modifications locales dans votre arborescence de travail, vous pouvez dire en toute sécurité git pulllorsque vous savez que le changement dans l'autre branche ne les chevauche pas.

Après avoir inspecté le résultat de la fusion, vous pouvez constater que le changement dans l'autre branche n'est pas satisfaisant. L'exécution git reset --hard ORIG_HEAD vous permettra de revenir là où vous étiez, mais elle rejettera vos modifications locales, dont vous ne voulez pas. git reset --mergeconserve vos modifications locales.

Voir aussi https://stackoverflow.com/a/30345382/621690

Risadinha
la source
Merci! Tu m'as sauvé la journée
Thiago Martins