Come ripristinare un'intera directory dalla cronologia del repository git?


91

Vorrei ripristinare un'intera directory (in modo ricorsivo) dalla cronologia del mio repository git.

C'è solo 1 ramo (master).

Conosco il commit in cui sono stati inclusi gli errori.

Posso utilizzare l'hash sha1 del commit genitore per ripristinare lo stato della directory com'era prima che gli errori fossero inclusi?

Ho pensato a qualcosa del genere:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

ma non ha funzionato.


7
prova ad aggiungere "-" tra revisioni e percorsi:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós

questo ha aiutato. Grazie mille.
Mostwanted

1
@ CarlosCampderrós Scrivilo come una vera risposta e raccogli i tuoi 15 punti prima che lo faccia qualcun altro;)
ralphtheninja

@MagnusSkog Non ero sicuro che avrebbe funzionato, quindi ho fatto un commento solo per verificare. Ora che sono sicuro che funziona, l'ho scritto come risposta :)
Carlos Campderrós

2
Come suggerimento generale, "non ha funzionato" non è molto utile. Spiegaci perché non ha funzionato, idealmente con l'output dell'errore (tagliato se è molto lungo).
io_e il

Risposte:


156

prova ad aggiungere "-" tra revisioni e percorsi:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

E se vuoi recuperare una directory dal commit precedente, puoi sostituire l'hash del commit con HEAD ~ 1, ad esempio:

git checkout HEAD~1 -- path/to/the/folder/ 

stesso comando, obiettivo quasi diverso: stackoverflow.com/questions/953481/...
cregox

18
C'è un problema però: l'OP non specifica se la directory esiste ancora. Per ripristinare una directory esistente allo stato di un commit, il contenuto della directory dovrebbe essere prima cancellato. In altri casi, i file esistenti che non esistevano nel vecchio commit non verranno rimossi.
Alberto

7
+1 @Alberto sono decisamente d'accordo. Ho fatto un rm -Rf path/to/the/folderpoi git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Risultato: che percorso ha avuto esattamente gli stessi file in quel commettere, differenze e nessun file aggiuntivi che erano stati creati dopo questo commettono. Che è quello che voglio
therobyouknow

2
cosa fa --?
Ray Foss

2
@RayFoss dice a git che i seguenti parametri sono file (altrimenti potrebbero essere confusi con un hash di commit, un ramo o qualcos'altro). Di solito non sono necessari ma non fa male metterli
Carlos Campderrós

3

Ci sono due semplici modi per farlo:

Se il commit che includeva gli errori includeva solo gli errori, utilizzare git revertper invertirne gli effetti.

In caso contrario, il percorso facile è questo:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

Se lo fai semplicemente git checkout <SHA-ID>, ti sposterà temporaneamente a quello sha-commit.

Ogni oggetto di commit contiene l'intera struttura del disco in quel momento, quindi se hai dei file lì e devi copiarli, puoi farlo. Attenzione però, non sarai in nessun ramo, quindi dovrai tornare al master prima di copiare il file nel tuo albero di lavoro e eseguirne il commit.


re "tornare al master" intendi master checkout?
Pacerier
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.