Come ripristinare una cartella su un commit particolare creando una patch


97

Ecco la mia cronologia per la cartella "somefolder"

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

Voglio riportare una cartella al commit "Bug risolti in qualche cartella".

Poiché il secondo commit ha comportato modifiche al di fuori di una cartella, non voglio annullare questo commit.

Immagino che il modo più sicuro sarebbe creare un diff / patch tra commit e095 e 89cd che si applica solo a qualche cartella, e quindi applicare quella patch. Come lo posso fare?

Risposte:


155

Puoi utilizzare git checkout per aggiornare il tuo repository a uno stato specifico.

git checkout e095 -- somefolder

Per quanto riguarda la tua domanda sulla generazione del diff, anche quello funzionerebbe. Basta generare il diff per tornare dal tuo stato attuale a e095:

git diff 89cd..e095 -- somefolder

30
questo non rimuove i file che sono stati aggiunti in quel commit, usa git reset e095 -- some/folderinvece
shime

2
Da git 2.22 puoi usare --no-overlayper in git checkoutmodo che i file tracciati che non sono in commit da cui stai effettuando il check-out vengano rimossi.
Mariusz Pawelski

53

È possibile utilizzare git resetper reimpostare l'indice che includerà anche la rimozione di file aggiunti in commit più recenti ( git checkoutda solo non lo fa):

git reset e095 -- somefolder

Tuttavia git resetnon aggiorna la copia di lavoro e l' --hardopzione non funziona con le cartelle. Quindi usa git checkoutper rendere la copia di lavoro uguale all'indice:

git checkout -- somefolder

e poi se vuoi rimuovere anche i file aggiunti devi anche fare:

git clean -fd somefolder

questa risposta funziona per me quando la directory include nuovi file.
Yahoho

2
Questa risposta è molto migliore se vuoi davvero un'istantanea pulita del repository in quel momento.
data princess

Davvero molto molto meglio!
Alexis Pautrot,
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.