2012-04-19 4 views
171

Come passare a un commit Git specifico senza perdere tutti i commit effettuati dopo di esso?Passare temporaneamente la copia di lavoro a un commit Git specifico

Desidero che i file locali vengano modificati, ma il database dei commit rimarrà intatto, solo il puntatore di posizione corrente è impostato sul commit attualmente selezionato.

Desidero modificare lo stato dei file in un commit specifico, eseguire il progetto e, al termine, ripristinare i file per l'ultimo commit.

Come fare senza zippare l'intera cartella del progetto?

+0

Correlato: [Ripristina a un commit Git precedente] (http://stackoverflow.com/q/4114095/456814). –

risposta

251

Se si è in un determinato ramo mybranch, è sufficiente andare avanti e git checkout commit_hash. Quindi è possibile tornare alla filiale entro il git checkout mybranch. Ho avuto lo stesso gioco bisecando un bug oggi :) Inoltre, dovresti sapere su git bisect.

+1

Ho notato che --hard sta facendo esattamente quello che voglio, e nessun commit è perso. – Paul

+6

Si noti che è possibile eseguire 'git checkout commit_hash' se si è su un repository pulito e non è necessario eseguire la ramificazione. Potrebbe essere più facile per alcuni casi d'uso (come il mio). – enderland

+0

@enderland: il tuo HEAD punta sempre su qualche ramo, normalmente :) –

39

Innanzitutto, utilizzare git log per visualizzare il registro, selezionare il commit desiderato, annotare l'hash sha1 utilizzato per identificare il commit. Successivamente, esegui git checkout hash. Dopo aver finito, git checkout original_branch. Questo ha il vantaggio di non spostare l'HEAD, semplicemente commuta la copia di lavoro su un commit specifico.

+4

Penso che tu voglia dire 'git checkout '. 'git checkout HEAD' è in effetti un NOOP –

+0

Ho notato che reset --hard sta facendo esattamente quello che voglio, e nessun commit è perso. – Paul

+3

'git reset --hard ' cambia l'HEAD del ramo corrente, mentre con 'git checkout ' si ottiene un checkout separato che non cambia nessun ramo, e si può facilmente tornare senza conoscere l'ID hash originale del ramo come mostrato in questa risposta. – jofel