Inizieremo con l'aggiunta di alcuni file. Nell'ultimo commit, aggiungeremo ed elimineremo file per creare una situazione disordinata. Quindi torneremo allo stato prima del caos.
Puoi creare una cartella chiamata /test ed eseguire i seguenti comandi per inizializzare Git e creare la situazione descritta sopra (stiamo facendo intenzionalmente commit separati per creare una cronologia):
$ git initRepository Git vuoto inizializzato in /Users/zakh_eecs/_work/LearnGIT/git_revert/test/.idiota/
$ echo x > file_1.TXT
$ git add -A
$ git commit -m "Aggiunta file_1.TXT"
[master (root-commit) 08caf5d] Aggiunta di file_1.TXT
1 file modificato, 1 inserimento(+)
crea modalità 100644 file_1.TXT
$ echo y > file_2.TXT
$ git add -A
$ git commit -m "Aggiungo file_2.TXT"
[master ba18a2f] Aggiunta di file_2.TXT
1 file modificato, 1 inserimento(+)
crea modalità 100644 file_2.TXT
$ echo z > file_3.TXT
$ git add -A
$ git commit -m "Aggiungo file_3.TXT"
[master 97f09ad] Aggiunta di file_3.TXT
1 file modificato, 1 inserimento(+)
crea modalità 100644 file_3.TXT
$ echo u > file_4.TXT
$ git add -A
$ git commit -m "Aggiungo file_4.TXT"
[master 9caf084] Aggiunta file_4.TXT
1 file modificato, 1 inserimento(+)
crea modalità 100644 file_4.TXT
$ echo v > file_5.TXT
$ git add -A
$ git commit -m "Aggiungo file_5.TXT"
[master 3f228b2] Aggiunta file_5.TXT
1 file modificato, 1 inserimento(+)
crea modalità 100644 file_5.TXT
Se controlliamo la nostra cartella, dovremmo vedere la seguente situazione:
$ ls -1file_1.TXT
file_2.TXT
file_3.TXT
file_4.TXT
file_5.TXT
Se controlliamo la cronologia, dovremmo avere i seguenti file:
$ git log --oneline3f228b2 Aggiunta di file_5.TXT
9caf084 Aggiunta di file_4.TXT
97f09ad Aggiunta di file_3.TXT
ba18a2f Aggiunta di file_2.TXT
08caf5d Aggiunta di file_1.TXT
Ora creiamo un po' di caos, elimineremo alcuni file e aggiungeremo un file danneggiato.
$ rm file_2.TXT$ rm file_4.TXT
$ echo w > mio_file_cattivo.TXT
$ git add -A
$ git commit -m "File aggiunti ed eliminati senza pensare alle conseguenze"
[master 879fbf8] File aggiunti ed eliminati senza pensare alle conseguenze
3 file modificati, 1 inserimento(+), 2 eliminazioni(-)
elimina modalità 100644 file_2.TXT
elimina modalità 100644 file_4.TXT
crea modalità 100644 my_bad_file.TXT
Ora, questa è la condizione della nostra cartella:
$ ls -1file_1.TXT
file_3.TXT
file_5.TXT
mio_file_cattivo.TXT
E questa la condizione della nostra storia:
$ git log --oneline879fbf8 File aggiunti ed eliminati senza pensare alle conseguenze
3f228b2 Aggiunta di file_5.TXT
9caf084 Aggiunta di file_4.TXT
97f09ad Aggiunta di file_3.TXT
ba18a2f Aggiunta di file_2.TXT
08caf5d Aggiunta di file_1.TXT
Ci rendiamo conto che non vogliamo l'ultimo commit 879fbf8. Quindi usiamo quanto segue il comando di ripristino:
$ git ripristina 879fbf8Si aprirà una finestra di testo per la modifica del commento automatico:
Ripristina "File aggiunti ed eliminati senza pensare alle conseguenze"Questo ripristina il commit 879fbf849c4bd6fb9a377604d6355c76b92a832c.
# Per favore inserisci il messaggio di commit per le tue modifiche. Linee che iniziano
# con '#' verrà ignorato e un messaggio vuoto interrompe il commit.
# Sul master di filiale
# Modifiche da eseguire:
# nuovo file: file_2.TXT
# nuovo file: file_4.TXT
# eliminato: my_bad_file.TXT
#
Puoi modificare il commento. Lo terremo così com'è. Non appena si salva la finestra dei commenti, l'attività di ripristino avrà luogo:
$ git ripristina 879fbf8[master 6e80f0e] Ripristina "File aggiunti ed eliminati senza pensare alle conseguenze"
3 file modificati, 2 inserimenti(+), 1 cancellazione(-)
crea modalità 100644 file_2.TXT
crea modalità 100644 file_4.TXT
elimina la modalità 100644 my_bad_file.TXT
Diamo un'occhiata alla nostra cartella ora:
$ ls -1file_1.TXT
file_2.TXT
file_3.TXT
file_4.TXT
file_5.TXT
I nostri file sono tornati in sequenza come prima. Tutte le aggiunte e le cancellazioni sono state ripristinate. Controlliamo il registro:
$ git log --oneline6e80f0e Ripristina "File aggiunti ed eliminati senza pensare alle conseguenze"
879fbf8 File aggiunti ed eliminati senza pensare alle conseguenze
3f228b2 Aggiunta di file_5.TXT
9caf084 Aggiunta di file_4.TXT
97f09ad Aggiunta di file_3.TXT
ba18a2f Aggiunta di file_2.TXT
08caf5d Aggiunta di file_1.TXT
C'è un nuovo impegno 6e80f0e. Eventuali modifiche che facevano parte di 879fbf8 è stato annullato e poi commesso in 6e80f0e.
Avvertimento: Il comando Git reset ti consente di annullare anche i commit. Ma nel caso di reset (soprattutto hard reset), avrebbe cancellato il 879fbf8 commetti come se non fosse mai successo e non ci sarebbe stato niente 6e80f0e commettere. Con un comando di ripristino, tutti possono vedere i cambiamenti che hanno avuto luogo. Nel caso di reset, non viene lasciata traccia. Quindi è una cattiva idea usare il comando reset in un repository pubblico perché può causare confusione di massa. La regola d'oro è: non utilizzare il ripristino nei repository pubblici, utilizzare il ripristino che è più sicuro.
In conclusione:
Il comando Git revert è un modo veloce e conveniente per rimediare ai tuoi errori. È un comando che dovresti ricordare se lavori regolarmente con Git.
Ulteriori studi:
- https://git-scm.com/docs/git-revert
- https://git-scm.com/docs/git-reset
- Git: impara il controllo della versione con Git: una guida completa per principianti passo dopo passo
- Controllo della versione con Git: potenti strumenti e tecniche per lo sviluppo di software collaborativo
- Pro Git, 2a edizione