Come annullare un pull git?


238

Vorrei annullare il mio git pull a causa di commit indesiderati sull'origine remota, ma non so a quale revisione devo ripristinare.

Come posso tornare allo stato prima di eseguire il git pull sull'origine remota?


4
Nota a margine: potresti trovarti utile git fetch upstreamprima di tutto, quindi dai un'occhiata veloce git diff upstream/branchper vedere in che cosa ti unirai. Se tutto va bene, procedi congit merge upstream/branch
Shahbaz,

1
Perderai tutto il tuo credito di strada e verrai agganciato di una settimana di stipendio se un programmatore di hipster ti vede eseguire comandi git da una GUI, ma sia GitHub Desktop che Atom hanno pulsanti sicuri e diretti per eseguire il undocommit e le caselle di controllo per mettere in scena i file in modo semplice e chiaro. Anche le GUI sono persone!
Dem Pilafian,

Risposte:


391

O per renderlo più esplicito dell'altra risposta:

git pull 

whoops?

git reset --keep HEAD@{1}

Le versioni di git precedenti alla 1.7.1 non hanno --keep. Se si utilizza tale versione, è possibile utilizzare --hard, ma questa è un'operazione pericolosa perché perde eventuali modifiche locali.


Al commentatore

ORIG_HEAD è lo stato precedente di HEAD, impostato da comandi che potrebbero avere un comportamento pericoloso, per poterli ripristinare facilmente. È meno utile ora che Git ha reflog: HEAD @ {1} è approssimativamente equivalente a ORIG_HEAD (HEAD @ {1} è sempre l'ultimo valore di HEAD, ORIG_HEAD è l'ultimo valore di HEAD prima di un'operazione pericolosa)


2
qual è la differenza tra HEAD @ {1} e HEAD ^?
hugemeow,

7
@hugemeow Sarebbe una bella domanda SO. Nel frattempo lo man git-rev-parsedescrive. HEAD@{1}è il valore precedente di simbolico HEADnel reflogmentre HEAD^è la (prima) revisione genitore della corrente HEAD. Questi due hanno bisogno di un cenno equivalente (es. Dopo un rebase, un hard reset, un cambio di ramo e simili). Leggi l'articolo collegato per reflog. Saluti
sehe

10
Gli utenti di PowerShell sfuggono alle parentesi quadre:git reset HEAD@`{1`}
Robert Claypool,

3
ss64.com/ps/syntax-esc.html Penso che tu abbia voluto scrivere HEAD@`{1`}, o del resto fare ciò che funziona anche sulle shell POSIX:'HEAD@{1}'
vedi il

2
Penso che non solo resetta l'attrazione, ma anche il mio commit = (
falsarella

67

git reflog showdovrebbe mostrarti la storia di HEAD. Puoi usarlo per capire dove eri prima del pull. Quindi è possibile resetla vostra HEADa che commettono.


git reflog show ha fornito questo output: c9e5e4d HEAD @ {0}: pull: avanzamento veloce 1c86a22 HEAD @ {1}: pull origin master: avanzamento rapido 05c141a HEAD @ {2}: pull: avanzamento veloce Posso ripristinare in sicurezza HEAD su HEAD @ {1}
Kartins,

L'altra risposta di sehe ha dettagli su come arrivarci.
Noufal Ibrahim,

Questo è stato molto utile dopo un disastroso impegno in qualche modo sparpagliato nella mia storia. Tirali fuori cercando un bene noto per ultimo nel reflog e poi forza la spinta.
Domenic,

E se pullfosse la prima azione? Se pullc'è HEAD@{1}, e nient'altro prima, come tornare a uno stato precedente?
Hendra Uzia,

Ricreare il repository?
Noufal Ibrahim,

29

Questo ha funzionato per me.

git reset --hard ORIG_HEAD 

Annulla un'unione o pull:

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

Dai un'occhiata a questo: HEAD e ORIG_HEAD in Git per ulteriori informazioni.


17

Trova il <SHA#>per il commit che vuoi andare. Puoi trovarlo in github o digitando git logo git reflog showdalla riga di comando e poi fai git reset --hard <SHA#>


Trova cosa per il commit?
Martin,

Mi dispiace, l'ho risolto<SHA#>
Nina il

Questo è il comando che utilizzo di più quando devo annullare qualcosa
Kartins,

2

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

Annullare un'unione o tirare all'interno di un albero di lavoro sporco

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

Anche se potresti avere modifiche locali nell'albero di lavoro, puoi tranquillamente dire git pullquando sai che la modifica nell'altro ramo non si sovrappone a loro.

Dopo aver esaminato il risultato dell'unione, è possibile che la modifica nell'altro ramo non sia soddisfacente. La corsa git reset --hard ORIG_HEAD ti riporterà dove eri, ma eliminerà le modifiche locali che non desideri. git reset --mergemantiene le modifiche locali.

Vedi anche https://stackoverflow.com/a/30345382/621690


Grazie! Mi hai salvato la giornata
Thiago Martins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.