Annulla git pull, come riportare i repository al vecchio stato


1006

C'è un modo per ripristinare o annullare git pull in modo che i miei sorgenti / repository tornino al vecchio stato che era prima di fare git pull? Voglio farlo perché ha unito alcuni file che non volevo fare, ma unendo solo altri file rimanenti. Quindi, voglio recuperare quei file, è possibile?

EDIT: voglio annullare git merge per chiarimenti. Dopo aver visto alcune risposte, l'ho fatto

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

Ora cosa dovrei fare? Fare git reset --hard è OK? Non voglio rovinarlo di nuovo, quindi chiedere passaggi dettagliati?


23
Sembra che tu abbia solo due cose nella tua storia: un clone e un recupero. Basta resettare al clone:, git reset --hard 01b34fain questo caso avresti potuto fare git reset --hard HEAD^quali ripristini a un commit prima di HEAD.
jkp,

2
- È necessariohard se si desidera modificare i file nella directory di lavoro
William Pursell,

3
@ seg.server.fault: se ha funzionato, puoi sempre accettare la risposta;)
jkp

7
git reset --hard HEAD ^
funroll

7
git reflogmostrerà tutto ciò che è stato fatto con Git. C'è una preoccupazione che git reset --hard [sha1 of something from reflog]ripristinerà tutto ciò che viene mostrato reflog, che a volte non è obiettivo, ad es. vuoi ripristinare l'unione sul ramo principale estratto dall'origine con dati errati (succede) e dopo quell'unione hai lavorato su altri rami. reflogmostrerà ogni chage su altri rami. Ma git checkout mastere git reset --hard [SH1 of commit on master branch just before merge]ripristinerà unico ramo master corrente rimozione merge tirato di origine.
Vladimir Vukanac,

Risposte:


1427

L'esecuzione git pullesegue le seguenti attività, nell'ordine:

  1. git fetch
  2. git merge

Il passaggio di unione combina i rami che sono stati configurati per essere uniti nella configurazione. Vuoi annullare il passaggio di unione , ma probabilmente non il recupero (non ha molto senso e non dovrebbe essere necessario).

Per annullare l' unione , utilizzare git reset --hardper ripristinare il repository locale su uno stato precedente; usa git-reflog per trovare lo SHA-1 dello stato precedente e poi resettalo.

avvertimento

I comandi elencati in questa sezione rimuovono tutte le modifiche non impegnate, portando potenzialmente a una perdita di lavoro:

git reset --hard

In alternativa, reimpostare su un determinato momento, ad esempio:

git reset --hard master@{"10 minutes ago"}

325
Un modo eccellente per raccogliere lo stato precedente, invece di utilizzare git-reflog e hash la copia, è quello di utilizzare un collegamento simile master@{1}, che è la posizione precedente master, master@{"5 minutes ago"}o master@{14:30}. Tutti i dettagli su come specificare le revisioni in questo modo sono disponibili nella man git-rev-parsesezione chiamata "specificare le revisioni".
Cascabel,

38
In questo caso dovrebbe funzionare anche ORIG_HEAD ("git reset --hard ORIG_HEAD")
Jakub Narębski,

@Jelfromi: grazie per quel suggerimento, non sapevo che potresti essere così prolisso sulle revisioni. Sapevo di scegliere le revisioni relative a HEAD, ma quando si poneva la domanda non sapevo molto tempo fa che voleva andare.
jkp,

Quando ho tirato, dice Updating d2c90a3..035ac4d. Qui puoi anche usare d2c90a3come parametro per resettare.
Thai

Non è necessario digitare hash quando si utilizza reflog. Puoi anche usare HEAD @ {1} o qualsiasi numero precedente come definito nel reflog.
Simon The Cat,

338

Come la risposta di jkp, ma ecco il comando completo:

git reset --hard a0d3fe6

dove a0d3fe6 si trova facendo

git reflog

e guardando il punto in cui vuoi annullare.


Perché non posso farlo git reset HEAD --hard, per esempio?
Sung Cho

9
@MikeC Questo approccio ti consente di tornare indietro di diversi pull, ad esempio
xji

2
Non sono stato in grado di utilizzare gli ID lato sinistro ma ho git reset --hard HEAD@{n}funzionato
E. Sundin il

1
Avresti dovuto suggerire una modifica alla risposta di jkp invece di quasi replicarla qui dopo tanti anni.
Abhishek Anand,

Se ho questo su git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} e bbbbbbb HEAD @ {2}. Se lo faccio git reset --hard bbbbbbb, perderò HEAD 0 e 1?
pmiranda

115

Un modo più moderno di annullare una fusione è:

git merge --abort

E il modo leggermente più vecchio:

git reset --merge

Il vecchio stile descritto nelle risposte precedenti (attenzione: scarterà tutte le modifiche locali):

git reset --hard

Ma in realtà, vale la pena notare che git merge --abortè solo equivalente a git reset --mergedato che MERGE_HEADè presente. Questo può essere letto nella guida di git per il comando merge.

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

Dopo una fusione fallita, quando non c'è MERGE_HEAD, la fusione fallita può essere annullata git reset --mergema non necessariamente con git merge --abort, quindi non sono solo vecchia e nuova sintassi per la stessa cosa . Questo è il motivo per cui trovo git reset --mergemolto più utile nel lavoro quotidiano.


20
git merge --abortfunziona DURANTE l'unione, non dopo che git pullè terminata. Quindi questa risposta sembra irrilevante per la domanda.
Abhishek Anand,

1
git reset --mergeelimina tutte le modifiche non messe in scena per il commit. L'ho scoperto nel modo più duro.
theadriangreen

62

funziona al primo utilizzo: git reflog

trova il tuo SHA del tuo stato precedente e crea (HEAD @ {1} è un esempio)

git reset --hard HEAD@{1}

40

Se hai gitk (prova a eseguire "gitk --all dalla tua riga di comando git"), è semplice. Basta eseguirlo, selezionare il commit a cui si desidera eseguire il rollback (clic con il pulsante destro del mouse) e selezionare "Ripristina ramo master qui". Se non si hanno modifiche non impegnate, selezionare l'opzione "difficile".


8
Vale la pena correre se non l'hai visto. Si apre una folle interfaccia grafica.
Evan Moran,

35

Supponiamo che sia $COMMITstato l'ultimo ID di commit prima di eseguire git pull. Quello che ti serve per annullare l'ultimo pull è

git reset --hard $COMMIT

.

Bonus:

Parlando di pull, vorrei condividere un trucco interessante,

git pull --rebase

Questo comando sopra è il comando più utile nella mia vita git che ha fatto risparmiare un sacco di tempo.

Prima di inviare il tuo nuovo commit al server, prova questo comando e sincronizzerà automaticamente le ultime modifiche del server (con un fetch + merge) e posizionerà il tuo commit in alto nel log di git. Non è necessario preoccuparsi di estrazione / unione manuale.

Per i dettagli, consultare: http://gitolite.com/git-pull--rebase


17

Questo è il modo più semplice per ripristinare le modifiche apportate.

** Warning **

Si prega di eseguire il backup dei file modificati perché eliminerà i file e le cartelle appena creati .

git reset --hard 9573e3e0

Dov'è il 9573e3e0tuo {ID commit}


questa risposta è molto utile, perché se facciamo un ramo di origine pull git otteniamo qualcosa del genere Updating ffce65bd..e929e884, il dogit reset --hard ffce65bd
Ernesto Alfonso

15

tu puoi fare git reset --hard ORIG_HEAD

poiché "pull" o "merge" impostano ORIG_HEAD come stato corrente prima di eseguire tali azioni.


5

git pull fare sotto l'operazione.

io. git fetch

ii. git merge

Per annullare pull, eseguire qualsiasi operazione:

io. git reset --hard --- ripristina anche tutti i cambiamenti locali

o

ii. git reset --hard master@{5.days.ago} (come 10.minutes.ago, 1.hours.ago, 1.days.ago..) per ottenere modifiche locali.

o

iii. git reset --hard commitid

Miglioramento:

La prossima volta usa git pull --rebaseinvece di git pull... cambia il suo server di sincronizzazione facendo (recupera e unisci).


4

Se c'è un'unione fallita, che è il motivo più comune per voler annullare una git pull, l'esecuzione git reset --mergefa esattamente quello che ci si aspetterebbe: mantenere i file recuperati, ma annullare l'unione che ha git pulltentato di unire. Quindi si può decidere cosa fare senza il disordine che a git mergevolte genera. E non ha bisogno di uno per trovare l'ID commit esatto che è --hardmenzionato in ogni altra risposta.

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.