Obiettivo 1: tornare indietro nel tempo¶
Dunque, se in git tutto è conservato in un database chiave/valore, probabilmente ci sarà modo per referenziare un qualunque oggetto del database usando la sua chiave.
In effetti è proprio così.
Adesso proviamo a tornare indietro nel tempo, al commit A
,
utilizzando il comando git checkout
.
Il comando checkout
prende il commit
indicato e lo copia nel
file system
e nella staging area
.
Già: ma qual è la chiave del commit A
? Lo puoi scoprire con un
client grafico o col comando git log
che mostra un elenco di tutti
i commit
memorizzati nel repository
git log --oneline
2a17c43 Commit B, Il mio secondo commit
56674fb commit A, il mio primo commit
Attenzione! Siccome nel commit
vengono memorizzati anche la data e
l’autore, le tue chiavi risulteranno diverse dalle mie. Sul mio
repository
la chiave del commit A
è 56674fb
.
Bene: torniamo indietro al passato, al momento del commit
A
ls
doh.html libs templates
git checkout 56674fb
ls
libs templates
Effettivamente, a parte un misterioso e prolisso messaggio nel quale
git si lamenta di essere in 'detached HEAD' state
(poi chiariremo
questo punto), il file system è tornato allo stato del primo commit e,
infatti, il file doh.html
è scomparso.
Se provi a lanciare di nuovo gitk riceverai un’altra sorpresa: apparentemente, il commit B è scomparso. Ma non temere: git lo sta solo nascondendo. Per visualizzare tutti i commit, usa l’opzione –all di gitk
gitk --all
Questo accade perché, generalmente, le interfacce grafiche di git cercano di mostrare solo i commit significativi, nascondendo ogni elemento superfluo. Gitk, per esempio, mostra solo i commit che appartengono alla linea di sviluppo che conduce alla posizione corrente, omettendo il proseguio della linea di sviluppo (cioè il suo futuro) e eventuali altre diramazioni. Nel caso della nostra storia, dal punto di vista del commit A, il commit B appartiene al futuro e a meno che non si chieda esplicitamente di visualizzarlo verrà omesso dalla visualizzazione.
Di seguito, ogni volta che dovessi stupirti perché ti sembra che git abbia fatto scomparire qualche commit, rassicurati lanciando
gitk --all
oppure
git log --graph --all --oneline
se preferisci non abbandonare la shell. Indice :: Obiettivo 2: divergere