Come annullare 'git reset'?


1314

Qual è il modo più semplice per annullare

git reset HEAD~

comando? Attualmente, l'unico modo a cui riesco a pensare è fare un "clone git http: // ..." da un repository remoto.


2
Se qualcuno sta cercando come annullare un hard reset, controlla Annullare un git reset --hard HEAD ~ 1 . Le soluzioni sono molto simili.


2
Non è un duplicato delle domande relative a --hard! Il rischio di eseguire questo comando per errore è molto più elevato. Ad esempio, si desidera rimuovere dalla scena un singolo file git reset foo-file. Scrivi solo la prima parte del nome file, premi tab per il completamento automatico, in realtà si completa con un nome di ramo, non lo noti ed esegui git reset foo-branchinvece il comando . Voilà
Yushin Washio,

Risposte:


2391

Risposta breve:

git reset 'HEAD@{1}'

Risposta lunga:

Git tiene un registro di tutti gli aggiornamenti di riferimento (es. Checkout, reset, commit, merge). Puoi vederlo digitando:

git reflog

Da qualche parte in questo elenco è il commit che hai perso. Diciamo che hai appena digitato git reset HEAD~e vuoi annullarlo. Il mio reflog è simile al seguente:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

La prima riga dice che HEAD0 posizioni fa (in altre parole, la posizione corrente) è 3f6db14; è stato ottenuto ripristinando a HEAD~. La seconda riga dice che HEAD1 posizione fa (in altre parole, lo stato prima del reset) è d27924e. È stato ottenuto controllando un particolare commit (anche se non è importante in questo momento). Quindi, per annullare il ripristino, eseguire git reset HEAD@{1}(o git reset d27924e).

Se, d'altra parte, hai eseguito altri comandi da allora che aggiornano HEAD, il commit che desideri non sarà in cima all'elenco e dovrai cercare in reflog.

Un'ultima nota: potrebbe essere più semplice cercare il reflogramo specifico che si desidera ripristinare, ad esempio master, piuttosto che HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Questo dovrebbe avere meno rumore rispetto al generale HEAD reflog.


25
Come alternativa più visiva e più piacevole a reflogquesto scopo, mi piace usare git log --graph --decorate --oneline $(git rev-list -g --all). Mostra un albero di tutti i commit, compresi rami pendenti senza nome
texasflood

1
Diciamo che ho una directory con file esistenti al suo interno. In questa directory corro git inite poi subito dopo git reset --hard. Non c'è reflog, o anche alcun registro per cominciare. Questi file sono praticamente brindisi ora?
AlanSE,

@AlanSE, purtroppo quei file sono brindisi, per quanto ne so. Se non l'hai mai fatto git add(ovvero non hai mai messo in scena quella versione del file), allora git checkouto git reset --hardspazzerai via l'unica copia (la directory di lavoro) senza backup. Vorrei che non lo fosse.
Mark Lodato,

2
git reset HEAD~12oops ... git reset HEAD@{12}nooo .. 'git reflog' in soccorso! oh è sologit reset HEAD@{1}
Dennis il

Dopo aver letto l'ottimo articolo git-scm.com/blog/2011/07/11/reset.html git-reset, sono un po 'meno confuso.
Andriy Drozdyuk,

192

Vecchia domanda e le risposte postate funzionano alla grande. Chime con un'altra opzione però.

git reset ORIG_HEAD

ORIG_HEADfa riferimento al commit a cui HEADfaceva riferimento in precedenza.


1
Sembra fantastico - saresti in grado di elaborare? "ORIG" è qui l'abbreviazione di "originale" o "origine"? ... Cioè, si reimposta su dove si trovava HEAD prima di iniziare a scimmiottarlo? O dove si trova HEAD sull'origine? Cosa succede se hai spostato HEAD più volte prima di git reset ORIG_HEAD? Grazie.
Benjohn,

ORIG sta per originale, ORIG_HEAD significa originale HEAD, prima del ripristino
Sam Gallagher

"Alcune operazioni, come l'unione e il ripristino, registrano la versione precedente di HEAD in ORIG_HEAD appena prima di regolarlo su un nuovo valore. È possibile utilizzare ORIG_HEAD per ripristinare o ripristinare lo stato precedente o fare un confronto." Estratto dal libro: "Controllo versione con Git"
Amirreza,

56

La mia situazione era leggermente diversa, l'ho fatto git reset HEAD~tre volte.

Per annullarlo ho dovuto fare

git reset HEAD@{3}

quindi dovresti essere in grado di fare

git reset HEAD@{N}

Ma se hai eseguito git reset usando

git reset HEAD~3

dovrai farlo

git reset HEAD@{1}

Poiché {N} rappresenta il numero di operazioni in Reflog. Come ha sottolineato Mark nei commenti.


2
l'opzione accettata non fornisce un esempio di come andare avanti NI si trovava in una situazione un'ora fa in cui volevo inoltrare più di 1. Ho provato con più e ha funzionato. Volevo aggiungerlo qui. Sarà utile per le persone in cerca di annullamento del ripristino con git reset HEAD ~ 3
zainengineer

3
ma se qualcuno ha eseguito git reset HEAD ~ 3, può vedere rapidamente come annullarlo, git reset HEAD @ {3} è necessario senza andare in reflog git reset HEAD ~ 3 ecc. è una situazione comune
zainengineer

1
Penso che chiunque veda {1} / {2} si accorgerebbe che il numero potrebbe essere qualsiasi numero di revisione, che il reflogcomando ti fornisce. Sono d'accordo sul fatto che il tuo punto sui numeri è lo stesso per entrambe le direzioni ~ 3 / @ {3} ma non è necessario che sia una nuova risposta.
Clint,

30

1.Utilizzare git reflogper ottenere l'aggiornamento di tutti i riferimenti.

2.git reset <id_of_commit_to_which_you_want_restore>

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.