Ho un vecchio impegno che ho fatto poche settimane fa. Voglio ripristinare solo un singolo file da quel commit. Cosa faccio?
Ho un vecchio impegno che ho fatto poche settimane fa. Voglio ripristinare solo un singolo file da quel commit. Cosa faccio?
Risposte:
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 ...)
revision-specification
dato che è quello che l'OP ha chiesto :)
shacommit~1
(es:) git checkout 0f4bbdcd~1 -- path/to/file.txt
per ottenere il commit immediatamente prima.
git checkout [Revision_Key] -- path/to/file
.git checkout
può gestire singoli file (vedi risposta per sehe), non è necessario copiare e incollare.
HEAD
, ORIG_HEAD
o nessuno di quelli in combinazione con ^
/ ~
/ @
notazione in stile.
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:
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.
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.
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 checkout
era 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 source
parametro (che nel tuo caso sarà un hash di commit).
Supponendo che l'hash di commit sia abcdef
il 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