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
$
Sono abbastanza sicuro che questo non è possibile, ma anch'io vorrei sapere se lo è! –
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
@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