Ripristina il file dal vecchio commit in git


Risposte:


222
git checkout 'master@{7 days ago}' -- path/to/file.txt

Questo non altererà HEAD, ma sovrascriverà semplicemente il file locale path/to/file.txt

Vedi man git-rev-parse per possibili specifiche di revisione lì (ovviamente un semplice hash (come dd9bacb) andrà bene)

Non dimenticare di confermare la modifica (dopo una revisione ...)


15
Wow, @heneryville e sehe, in realtà pensavo che "7 giorni fa" fosse una meta per te, per capire cosa commettere. ty!
AnneTheAgile

7
Parte 2 Quando si desidera scegliere un determinato commit, il formato sopra riportato non funziona. Invece utilizzare ciò Urs mostrato di seguito, git checkout commitShaNumber - path / to / file.txt per stackoverflow.com/questions/215718/...
AnneTheAgile

2
@AnneTheAgile in effetti è sempre esattamente la stessa sintassi, mi è appena capitato di dare un esempio "complesso" di un revision-specificationdato che è quello che l'OP ha chiesto :)
vedi

1
Se il commit è stato utilizzato per eliminare il file che si sta tentando di ripristinare, utilizzare shacommit~1(es:) git checkout 0f4bbdcd~1 -- path/to/file.txtper ottenere il commit immediatamente prima.
sdlins il

90
  1. Controlla il file dal tuo vecchio commit tramite git checkout [Revision_Key] -- path/to/file.
  2. Aggiungi, esegui il commit, spingi come appropriato.

3
git checkoutpuò gestire singoli file (vedi risposta per sehe), non è necessario copiare e incollare.
Koraktor,

1
Le chiavi di revisione sono sempre SHA1 per il commit?
IslandCow,

1
Lo sono, ma di solito i primi 6-8 caratteri di SHA1 sono sufficienti per identificare la revisione.
Urs Reupke,

2
@IslandCow no, possono essere SHA1, ma anche ramo, tag, o qualsiasi altra cosa che indica un impegnano, per esempio HEAD, ORIG_HEADo nessuno di quelli in combinazione con ^/ ~/ @notazione in stile.
Alois Mahdal,

2
Indichi che uno dovrebbe "aggiungere" il file in seguito. Ma non è corretto. Il file non viene posizionato nell'area di gestione temporanea. È già stato aggiunto.
xApple,

9

Avevo bisogno di ripristinare un file recente impegnato in git. Quindi, solo per ribadire e dare un'altra prospettiva, devi farlo eseguendo i seguenti due passaggi:

  1. git log -3
    Questo mostra i tre commit più recenti. Leggi i commenti e il nome dell'autore in modo da restringere la versione esatta che desideri. Annota quell'ID commit lungo (ovvero b6b94f2c19c456336d60b9409fb1e373036d3d71) per la versione di commit che desideri.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    Passa l'ID commit E il nome file che desideri ripristinare. Assicurati di avere uno spazio prima e dopo il doppio trattino.

Ci sono molti altri modi per farlo. Ma questo è il più semplice che posso ricordare. Spero che aiuti.

NOTA: se ci si trova all'interno del percorso / cartella del progetto, non è necessario digitare il percorso completo del file nel comando di pagamento.


Il miglior commento di sempre. Poiché quello, che è la risposta accettata, presuppone che il file che deve essere recuperato sia trasferito a monte, tuttavia questo comando recupera / ripristina il file che esiste solo localmente.
ot0,

1
Ho appena provato questo nella cartella principale del mio repository git locale. Avevo ancora bisogno di fornire il percorso relativo al file. Basta fornire il - [nome file] da solo non ha funzionato.
user2784627

@ ot0 No, non lo presume. Sono esattamente la stessa risposta.
matt

4

Tutte le risposte menzionano git checkout <tree-ish> -- <pathspec>. A partire da git v2.23.0 c'è un nuovo metodo di ripristino git che dovrebbe assumere parte di ciò che git checkoutera responsabile. Vedi i punti salienti delle modifiche sul blog di github .

Il comportamento predefinito di questo comando è di ripristinare lo stato di un albero di lavoro con il contenuto proveniente dal sourceparametro (che nel tuo caso sarà un hash di commit).

Supponendo che l'hash di commit sia abcdefil comando sarebbe simile al seguente:

git restore --source=abcdef file_name

che (di default) lo mette nell'albero di lavoro. Se vuoi mettere la modifica direttamente nell'indice in modo che possa essere impegnata immediatamente:

git restore --source=abcdef --worktree --staged file_name

o con nomi di opzioni brevi:

git restore -s=abcdef -W -S file_name
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.