Git è un potente strumento per tenere traccia di ogni versione della tua base di codice ed è spesso necessario guardare indietro nel tempo e recuperare vecchie versioni di file. Git può ripristinare interi commit o ripristinare l’intero repository, ma può anche ripristinare le modifiche a un singolo file o cartella.
Ripristino vs. ripristino
Di solito, quando “ripristina” un commit, Git applica un nuovo commit applicando le modifiche opposte, annullandolo di fatto. Questo è utile se commetti un errore e devi “eliminare” quel commit, sebbene sia ancora registrato nella cronologia.
Il ripristino del repository è leggermente diverso. Puoi ripristinare solo un commit alla volta, ma se esegui un git reset
, Git cambierà completamente lo stato del repository fino a quando è stato eseguito il commit. Questo viene fatto per molte ragioni, di solito per eliminare i commit o correggere la cronologia dei rami.
Entrambe queste operazioni funzionano sull’intero repository, ma puoi anche utilizzare comandi simili per eseguire le stesse azioni su singoli file o cartelle. Ad esempio, l’utilizzo git reset
su un singolo file riporterà quel file a com’era quando è stato eseguito il commit. Questo è utile se vuoi semplicemente scegliere una vecchia versione del file dalla cronologia di Git.
Guardando le vecchie versioni in Git
La soluzione a bassa tecnologia per ripristinare un file come era prima è piuttosto semplice: Github e la maggior parte degli altri server Git tengono traccia della cronologia dei file e puoi semplicemente fare clic su un commit e fare clic su “Sfoglia file” per visualizzare un snapshot del tuo repository da indietro nel tempo. È quindi possibile scaricare il file o copiare il testo.
Ciò è particolarmente utile se stai lavorando con file di codice di grandi dimensioni e vuoi guardare le vecchie versioni delle funzioni che hai scritto. Probabilmente non vuoi ripristinare l’intera cosa in quel caso, solo la singola funzione. Puoi copiare il codice da quella funzione senza toccare la CLI di Git.
Reimpostare un file su una versione precedente in Git
In questo repository di prova, abbiamo creato un commit che ha modificato il README e aggiunto un nuovo file. Vogliamo ripristinare le modifiche apportate al README, ma non vogliamo ripristinare l’intero repository al commit iniziale.
La soluzione è ripristinare solo il README controllando una vecchia versione di quel file. Il comando di Git checkout
fa molte cose, come cambiare branch, ma è fondamentalmente usato per scaricare file dato un commit o un branch ID.
Per ripristinare un file a una versione precedente, dovrai trovare l’ID commit da quando desideri ripristinare. È possibile utilizzare git log
per questo, con ambito a un singolo file per visualizzare solo le modifiche apportate a quel file:
git log README.md
Copia l’ID per il commit, quindi esegui git checkout
con l’ID e il percorso del file:
git checkout 22710694b25d7ce5297559851beb7d3e4de811bb README.md
Ciò modificherà nuovamente il file, ma non eseguirà ancora il commit delle modifiche. Sei libero di modificarlo e impegnarti quando sei pronto.
In questo esempio, git checkout
hai messo in scena le modifiche per il commit successivo. Se non vuoi eseguirne il commit, sei libero di annullare le modifiche. Questo può essere utile per scaricare temporaneamente vecchie versioni di file senza l’uso di Github.
Ripristino delle modifiche ai singoli file
Allo stesso modo, se vuoi ripristinare le modifiche in un singolo commit, puoi farlo con git revert
. Tuttavia, non c’è modo di applicarlo a un singolo file, ma puoi semplicemente ignorare le modifiche se il commit interessa altri file.
Usa il --no-commit
flag per consentire la modifica del “revert commit” che Git crea automaticamente.
git revert de8564b131ca6a15a7e7c73f5ef156b119cc0b93
Ciò ti consentirà di modificare i file prima di finalizzare il ripristino. Se sono previste modifiche indesiderate, puoi rimuoverle tramite il tuo client o con un git checkout
.
git checkout -- file