2013-07-15 12 views
8

Dire ho modificato un fileCome ripristinare un file di staging con modifiche, conservando le modifiche a quando è stato messo in scena?

echo "hi" > someVersionedFile.txt 

//Then I staged the file 
git add . 
git status 

<console reads> 
Changes to be committed 
new file: someVersionedFile.txt 

Ora apportare ulteriori modifiche ai file

echo "hi again file" >> someVersionedFile.txt 

//Then I restage the file with these changes 
git add . 
git status 

<console reads> 
Changed but not commited 
modified file: someVersionedFile.txt 

Domanda: come faccio a Ripristinare l'ultima versione in scena? È possibile farlo poiché non è stato eseguito?

+0

Sono abbastanza sicuro che questo non è possibile, ma anch'io vorrei sapere se lo è! –

+0

Non sei sicuro di come lo fai, ma se esegui il commit ora, verranno confermate solo le modifiche graduali. È quindi possibile ripristinare quel file per il commit appena creato. – andypaxo

+0

@andypaxo Questo non è il problema.Più da vicino, il problema è che se si mette in scena un file con modifiche; apportare ulteriori modifiche ad esso, quindi come si ripristina il file quando è stato messo in scena - dato che c'erano/ci sono ulteriori modifiche al file in scena? – stackoverflow

risposta

5

Probabilmente è possibile farlo, ma non esiste un singolo comando semplice per farlo.

Quando si esegue git add, il file è già stato aggiunto al repository, ma attualmente non vi è nulla che lo indichi tranne l'indice. Quando si esegue un secondo git add, il nuovo file (versione del) viene aggiunto al repository e il collegamento tra l'indice e la prima versione del file viene sostituito con il nuovo collegamento. Ma il primo oggetto è ancora lì.

È possibile utilizzare git fsck --dangling per ottenere un elenco di oggetti BLOB nel repository che non sono attualmente fa riferimento nulla, ma poi si dovrà passare attraverso di loro uno per uno con git show, git cat-file, ecc per determinare quale è il file che vuoi Una volta trovato il file giusto, è possibile git show HASH > somefile.txt (e forse git add somefile.txt).

Ovviamente, se hai già effettuato git prune, git gc, ecc. Dal secondo git add, che potrebbe aver effettivamente rimosso il file originale dal tuo repository.

Ecco un rapido esempio:

$ git init foo 
Initialized empty Git repository in foo/.git/ 
$ cd foo 
$ echo blah > foo.txt 
$ git add foo.txt 
$ echo blarg > foo.txt 
$ git add foo.txt 
$ git fsck --dangling 
Checking object directories: 100% (256/256), done. 
dangling blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 
$ git show 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 
blah 
$ 
4

Non è possibile farlo. Git può solo ripristinare i file a un precedente commit, non alla precedente versione a fasi. Questo perché il file non verrà inserito nel repository di git fino a quando non si effettua il commit. (È possibile leggere ulteriori informazioni sulle migliori pratiche in commettere su Coding Horror)

Forse è possibile applicare un uso giudizioso del pulsante undo? (Se hai modificato il codice in un editor, ovviamente il file echo non ha annullamenti).

0

Vuoi dire che si vuole tornare al la versione messa in scena? Sì, puoi sicuramente farlo. Probabilmente il modo più semplice è quello di impegnarsi solo le modifiche in scena, checkout il file da che commettono, e quindi reimpostare la vostra filiale:

git commit -m "Temporary commit" 
git checkout HEAD -- /path/to/file_you_want_to_revert 
git reset HEAD~ 

Edit: Oops, mi dispiace non ho notato la parte in cui si rimontato il file con le nuove modifiche. Siamo spiacenti, ma le altre risposte sono corrette: questo non è possibile (o almeno non è molto facile). Lascerò questa risposta, nel caso in cui qualcun altro abbia un problema simile ma non abbia ancora sovrascritto la cache.

+1

Sebbene sia la risposta sbagliata, è possibile ottenere lo stesso solo con 'git checkout/path/to/file_you_want_to_revert' senza dare un nome di ramo. – mihi

Problemi correlati