2010-09-03 16 views
185

Con git log, ottengo un elenco di commit che ho effettuato finora.Ripristino a un commit specifico basato su ID commit con Git?

commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1 
Author: prosseek 
Date: Fri Sep 3 14:36:59 2010 -0500 

    Added and modified the files. 

commit c14809fafb08b9e96ff2879999ba8c807d10fb07 
Author: prosseek 
Date: Tue Aug 31 08:59:32 2010 -0500 

    Just simple test for core.editor. 

... etc ... 
  • Come faccio a tornare indietro ad una specifica impegnarsi? Ad esempio, cosa devo fare se voglio tornare a commit c14809fafb08b9e96ff2879999ba8c807d10fb07?

  • C'è qualche altro/modo migliore per tornare a un commit specifico con Git? Ad esempio, posso mettere qualche etichetta di ogni commit per riaverla con l'etichetta?

+0

Anche se questa domanda è in realtà più vecchio di quello che è ora contrassegnato come duplicato di, quello ha una risposta migliore. http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha/147651#147651 –

+2

Questo è un perfetto esempio di come f - k'd up git è (dalla risposta di bwawok): * "... allora se si voleva spingerlo a qualcun altro che ha la nuova storia, fallirebbe" *. A che serve se non riesci a ricontrollarlo nel repository remoto ??? Sono assolutamente stupito di quanto sia difficile Git ha reso semplici operazioni. – jww

+1

@jww Ho letteralmente letto per un'ora su come tornare a un commit precedente e ancora non conosco la risposta. Sei assolutamente corretto, git rende le cose più complicate di quanto dovrebbe essere. – robben

risposta

304

Vuoi riportare il pronti contro termine a questo stato? O vuoi solo che il tuo repo locale assomigli?

se si fa

git reset --hard c14809fa 

che renderà il vostro codice locale e storia locale siano proprio come lo era in quel commesso. Ma se poi volessi spingerlo a qualcun altro che ha la nuova storia, fallirebbe.

se si fa

git reset --soft c14809fa 

che renderà il vostro file locali modificati per essere come lo erano allora, ma lasciare la vostra storia, ecc lo stesso.

Quindi, che cosa vuoi fare esattamente con questo reset?

Edit -

È possibile aggiungere "tag" al tuo repo .. e poi tornare a un tag. Ma un tag è davvero solo una scorciatoia per lo sha1.

È possibile taggare questo come TAG1 .. quindi uno git reset --soft c14809fa, git reset --soft TAG1 o git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07 farebbero tutti la stessa cosa.

+1

Avevo bisogno di tornare a quello stato. Ma è bello sapere che potrei avere l'opzione di "apparire così". Grazie per avermi fatto sapere. A proposito, quale opzione è l'impostazione predefinita? duro o morbido? – prosseek

+1

@prosseek l'impostazione predefinita è in realtà mista. --mixed Ripristina l'indice ma non l'albero di lavoro (ad esempio, i file modificati vengono conservati ma non contrassegnati per il commit) e segnala ciò che non è stato aggiornato. Questa è l'azione predefinita. Vedere http://www.kernel.org/pub/software/scm/git/docs/git-reset.html – bwawok

+0

@prosseek: se le varie modalità di ripristino sono un po 'di confusione per te, anche dopo aver letto la pagina man (attentamente!) potresti provare questa altra domanda http://stackoverflow.com/questions/2530060/can-you-explain-to-me-git-reset-in-plain-english – Cascabel

15

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07 è quello che stai dopo ...

+0

Non sarà necessario digitare l'intero sha, solo un po 'funzionerà – bwawok

+31

@bwawok: Ma è più veloce selezionare e fare clic-clic-incolla rispetto a digitare anche un SHA1 abbreviato! – Cascabel

+3

Sarà un 'git push origin mybranch', quindi il repo di origine verrà ripristinato? – javadba

2

Se si vuole forzare la situazione, si può fare:

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07 

si rimandano a come il vostro clone git sembrava al momento del check-in

+0

in quali casi è necessario forzare? – jacoballenwood

+1

cosa significa "al momento del checkin"? ambiguo. se faccio "git reset --hard X" è lo stato repo come prima commit X o dopo commit X ... – nyholku

+0

reset git --hard X. Questo ripristinerà lo stato del repository come prima commit X. renderà il tuo codice locale e la tua storia locale esattamente come nel commit. Ma se si volesse inviarlo al master locale o al master remoto con una cronologia diversa, fallirebbe. Quindi verrà letta solo la versione del tuo repository. –

117

penso, la risposta di bwawok è sbagliata ad un certo punto:

se si fa

git reset --soft c14809fa 

Renderà i tuoi file locali modificati per essere come erano allora, ma lascerà la tua cronologia ecc. Lo stesso.

Secondo manual: git-reset, "Git resettare --soft" ...

non tocca il file di indice, né l'albero di lavoro a tutti (ma reimposta la testa ai <commettere>, proprio come tutte le modalità funzionano).Questo lascia tutti i tuoi file modificati "Modifiche da impegnare", come direbbe lo stato di git.

Così "rimuoverà" i nuovi commit dal ramo. Ciò significa che, dopo aver guardato il tuo vecchio codice, non puoi tornare al più recente commit in questo ramo, facilmente. Così fa il contrario come descritto da bwawok: I file locali non vengono modificati (sembrano esattamente come prima "git reset --soft"), ma la cronologia viene modificata (il ramo viene troncato dopo il commit specificato).

Il comando per la risposta di bwawok potrebbe essere:

git checkout <commit> 

È possibile utilizzare questo per sbirciare vecchia versione: come ha fatto il mio codice aspetto di ieri?

(lo so, dovrei mettere questo nei commenti a questa risposta, ma StackOverflow non mi permette di farlo! La mia reputazione è troppo bassa.)

+1

un bravo ragazzo con ancora una reputazione bassa :) – keni

+0

ma 'git checkout' è di sola lettura, quindi non è possibile eseguire una vecchia revisione. – robben

+0

@Peter A: Dopo "git reset --soft" seguito da "git checkout", non vedo alcuna modifica a un file su cui ho lavorato. Potrebbe essere perché non sono nel ramo principale? – moonman239

Problemi correlati