Domanda Reimposta o ripristina un file specifico per una revisione specifica usando Git?


Ho apportato alcune modifiche a un file che è stato impegnato alcune volte come parte di un gruppo di file, ma ora voglio ripristinare / ripristinare le modifiche su di esso su una versione precedente.

Ho fatto un git log insieme a a git diff per trovare la revisione di cui ho bisogno, ma non ho idea di come riportare il file al suo stato precedente in passato.


3442
2017-10-18 23:34


origine


risposte:


Supponendo che l'hash del commit che vuoi sia c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

Il git checkout la pagina man fornisce maggiori informazioni.

Se si desidera ripristinare il commit prima c5f567, append ~1 (funziona con qualsiasi numero):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

Come nota a margine, sono sempre stato a disagio con questo comando perché è usato sia per cose ordinarie (cambiando tra i rami) sia per cose insolite e distruttive (scartando le modifiche nella directory di lavoro).


4651
2017-10-18 23:39



È possibile rivedere rapidamente le modifiche apportate a un file utilizzando il comando diff:

git diff <commit hash> <filename>

Quindi per ripristinare un file specifico su quel commit usa il comando reset:

git reset <commit hash> <filename>

Potrebbe essere necessario utilizzare il --hard opzione se hai modifiche locali.

Un buon flusso di lavoro per gestire i waypoint consiste nell'utilizzare i tag per contrassegnare in modo pulito i punti nella timeline. Non riesco a capire la tua ultima frase, ma quello che potresti volere è divergere un ramo da un punto precedente nel tempo. Per fare ciò, usa il pratico comando checkout:

git checkout <commit hash>
git checkout -b <new branch name>

Puoi quindi rebase contro la tua linea principale quando sei pronto per unire le modifiche:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

508
2017-12-17 06:59



Puoi usare qualsiasi riferimento a un commit git, incluso SHA-1 se è il più conveniente. Il punto è che il comando si presenta così:

git checkout [commit-ref] -- [filename]


305
2018-04-07 21:48



git checkout -- foo

Questo si resetterà foo alla TESTA. Puoi anche:

git checkout HEAD^ foo

per una revisione indietro, ecc.


243
2017-08-29 20:56



E per ripristinare l'ultima versione confermata, che è più frequentemente necessaria, è possibile utilizzare questo comando più semplice.

git checkout HEAD file/to/restore

106
2018-01-14 06:15



Ho avuto lo stesso problema solo ora e ho trovato questa risposta più facile da capire (commit-ref è il valore SHA della modifica nel log in cui si desidera tornare):

git checkout [commit-ref] [filename]

Questo metterà quella vecchia versione nella tua directory di lavoro e da lì puoi impegnarla se vuoi.


100
2018-05-27 17:52



Se sai quanti commit hai bisogno di tornare indietro, puoi usare:

git checkout master~5 image.png

Questo presuppone che tu sia sul master ramo, e la versione desiderata è 5 torna indietro.


85
2018-04-07 14:03



Penso di averlo trovato .... da http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

A volte vuoi solo tornare indietro e dimenticare ogni cambiamento oltre un certo punto perché sono tutti sbagliati.

Iniziare con:

$ git log

che mostra un elenco di commit recenti e i loro hash SHA1.

Quindi, digita:

$ git reset --hard SHA1_HASH

per ripristinare lo stato su un dato commit e cancellare definitivamente tutti i nuovi commit dal record.


75
2017-12-17 06:53



Questo ha funzionato per me:

git checkout <commit hash> file

Quindi commetti la modifica:

git commit -a

59
2017-08-25 22:12



Devi stare attento quando dici "rollback". Se avevi una versione di un file in commit $ A, e successivamente apportai due modifiche in due commit separati $ B e $ C (quindi quello che stai vedendo è la terza iterazione del file), e se dici " Voglio tornare indietro al primo ", lo intendi davvero?

Se vuoi eliminare le modifiche sia della seconda che della terza iterazione, è molto semplice:

$ git checkout $A file

e poi tu commetti il ​​risultato. Il comando chiede "Voglio controllare il file dallo stato registrato dal commit $ A".

D'altra parte, quello che intendevi è eliminare la modifica della seconda iterazione (cioè commit $ B), mantenendo ciò che commit $ C ha fatto al file, vorrai ripristinare $ B

$ git revert $B

Si noti che chiunque abbia creato commit $ B potrebbe non essere stato molto disciplinato e potrebbe aver commesso modifiche totalmente indipendenti nella stessa commit, e questo ripristino potrebbe toccare file diversi da file vedi le modifiche offensive, quindi potresti voler controllare attentamente il risultato dopo averlo fatto.


53
2018-01-11 08:13



In modo divertente, 'git checkout foo' non funzionerà se la copia di lavoro si trova in una directory chiamata foo; tuttavia, sia "git checkout HEAD foo" che "git checkout ./foo":

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

35
2017-08-29 21:26