2009-05-23 5 views
59

Recentemente ho eseguito il commit di un file sull'HEAD del mio ramo che contiene errori. Ho bisogno di fare le seguenti cose:Git: estrarre un file da un commit precedente e modificarlo a HEAD

  • ottenere che il file da un commit precedente a testa

  • Commit che file indietro nella testa

Qual è il modo migliore di andare a tale proposito?

+1

Il modo più semplice sarebbe quella di copiare il file contenuto da quel particolare commit usando un client ui (o da github bitbucket etc) e incollalo nel tuo file corrente e commetti :) Più facile di scrivere l'hash e il percorso – nawfal

risposta

91

quali hai praticamente detto tu stesso:

prima ottenere il file di ritorno da un commit prima:

$> git checkout HEAD~1 path/to/file.ext 

Poi commetterlo:

$> git commit -a -m 'Retrieved file from older revision' 

Se solo le modifiche a tale file dove presente nell'ultimo commit, puoi anche usare git-revert:

$> git revert HEAD 

Penso che sarebbe meglio rendere questo un commit separato, perché ti dice esattamente cosa hai ripristinato e perché. Tuttavia, è possibile schiacciare questo nel commit precedente utilizzando lo switch --amend su git-commit.

+0

--amend sarebbe un interruttore per git commit, non git add – bdonlan

+0

Oops, hai ragione. Fisso. – sykora

+0

git-revert * dovrebbe * effettuare un commit separato (non era completamente chiaro dalla descrizione). L'uso di "git commit --amend" correggerebbe l'ultimo commit, invece di creare un nuovo on (ma non puoi farlo se hai pubblicato questa parte della storia) –

0

Attenzione, in questo scenario:

Commit hash - File modified 
aaaaaaa  index.php 
bbbbbbb  test.php 
ccccccc  index.php 

git checkout HEAD ~ 1 (o HEAD ^) index.php cercare di checkout il file index.php per precedente hash HEAD (bbbbbbb), ma questo non è il vero file di hash di commit precedente è ccccccc. Nel precedente hash HEAD, index.php rimane invariato perché l'ultima modifica è stata apportata in hash ccccccc.

Per ripristinare qualche file di commit precedente hash che ha colpito il file, uso:

git log -n 2 --pretty=format:%h path/to/file.ext 

Ignora primo hash e prendere la seconda hash, quindi:

git checkout <second_hash> path/to/file.ext 
git commit -m 'Revert this file to real previous commit'