Git non va considerato tanto uno strumento per lo sviluppo quanto una soluzione per la gestione delle fasi di sviluppo, ecco perché poter gestire le operazioni effettuate durante il versioning (ed eventualmente annullarle) registrando i diversi passaggi cronologicamente, può rivelarsi fondamentale per l'economia di un progetto. Alcuni dei comandi descritti in questa parte della guida, in particolare per quanto riguarda l'annullamento, non sono reversibili, motivo per il quale si consiglia di utilizzarli con la dovuta attenzione.
Annullamento dei commit
Il comando git commit
offre un'opzione, --amend
, che consente di risolvere una problematica abbastanza frequente per chi utilizza strumenti destinati al controllo di versione, accade infatti abbastanza spesso che un commit venga effettuato prematuramente, dimenticando per esempio di includere un file invece coinvolto nell'aggiornamento del progetto corrente; nello stesso modo l'utilizzatore potrebbe aver lanciato l'ultimo commit associando ad esso un messaggio errato.
Avvalersi di questa opzione è relativamente semplice, l'immagine seguente mostra la procedura per l'annullamento dell'ultimo commit eseguito in seguito alla creazione di un file denominato TODO
dopo il passaggio nell'area di stage; anche in questo caso il progetto di riferimento sarà quello relativo alla cartella MyWP
.
Analizzando le operazioni effettuate si nota innanzitutto che, esattamente come nel caso dei commit per l'aggiornamento del repository presente nella directory del DVCS, anche quando si utilizza l'opzione --amend
non si avrà la necessità di passare il nome del file o dei file coinvolti come parametri per l'istruzione; un commit riguarda infatti tutte le modifiche effettuate a carico di un progetto a partire dall'istantanea precedente, così sarà anche per il suo annullamento.
Quest'ultima osservazione risulta utile per capire come il compito di --amend
sia quello di adottare le informazioni allocate in stage per l'esecuzione del commit, infatti, nel caso in cui non siano state apportate delle modifiche a partire dall'ultimo commit prima del comando per l'annullamento, l'istantanea generata sarà la medesima con l'eccezione della descrizione associata al commit.
Si noti infine che il lancio di git commit
con opzione --amend
determinerà automaticamente l'apertura dell'editor predefinito associato alla propria installazione del DVCS, cosa che permetterà di effettuare l'intervento di correzione tralasciato prima dell'ultimo commit.
Annullamento dei commit e staging
Un caso particolare nell'uso dell'opzione --amend
riguarda l'annullamento di un commit da effettuare quando si dimentica di memorizzare in staging un file che sarebbe dovuto essere coinvolto dal commit stesso. A tal proposito l'esempio riportato tramite le istruzioni seguenti riguarda un commit a cui segue il passaggio in stage di un nuovo file denominato LIST
e il conseguente annullamento del commit.
$ git commit -m 'Things to Do Before You Die'
$ git add LIST
$ git commit --amend
La soluzione proposta consentirà di aggiungere al commit le modifiche relative ad un file quando non inserite in stage, sostanzialmente attraverso di essa verrà eseguita un'operazione di sovrascrittura in quanto il secondo commit sostituirà il primo.
Modifiche ai file e annullamento
Dopo aver effettuato una modifica al già citato file TODO
, prima di effettuare il passaggio all'area di stage tramite git add
si lanci il comando git status
per verificare lo stato di avanzamento del proprio progetto.
Ora, analizzando il risultato dell'istruzione, sarà possibile notare la parte nella quale viene riportata questa segnalazione:
(use "git checkout -- ‹file›..." to discard changes in working directory)
In pratica, nel caso in cui si voglia annullare una modifica operata a carico di un file in modo che esso ritorni allo stato precedente l'ultimo commit, sarà possibile utilizzare un'istruzione basata sul comando git checkout
seguito dall'opzione -- file
, dove per "file" si intende il nome del file del quale si vogliano annullare le modifiche.
Data la delicatezza dell'argomento è bene ricordare una regola generale del versioning con Git: tutto quello che viene sottoposto a commit è recuperabile, le procedure necessarie potrebbero essere più o meno complesse a seconda dei casi ma si parla di processi reversibili, ciò che invece non partecipa al passaggio nella directory del DVCS non lo è, motivo per il quale comandi come git checkout
dovranno essere utilizzati con estrema attenzione.
Annullare lo spostamento di un file in area di stage
L'immagine seguente mostra la risposta di Git dopo il lancio di un'istruzione basata su git add
per la memorizzazione in staging di alcune modifiche effettuare a carico del già più volte manipolato file TODO
, si presti particolare attenzione alle notifiche contenute nell'output di git status
:
Nel caso specifico delle operazioni di annullamento la parte di maggior interesse riguarda la segnalazione sull'unstaging:
Changes to be committed:
(use "git reset HEAD ‹file›..." to unstage)
Per rimuovere un file inviato in area di stage sarà quindi necessario utilizzare un'istruzione basata sul comando git reset HEAD
seguito dal nome del file per il quale si desidera operare l'unstaging; quindi, relativamente al file TODO
l'input dovuto sarà il seguente:
$ git reset HEAD TODO
Tale operazione verrà confermata da un output che si limiterà a testimoniare l'avvenuto annullamento dello staging:
Unstaged changes after reset:
M TODO
Mentre maggiori informazioni verranno rese disponibili tramite una verifica dello stato corrente del progetto:
Il risultato ottenuto sarà quindi quello di disporre nuovamente del file nella sola directory di lavoro, con le medesime modifiche apportate prima dello staging, l'unstaging infatti non causerà alcun cambiamento a carico del contenuto del file coinvolto.
La cronologia dei commit
Tra modifiche a carico dei file, spostamenti in area di stage e commit, si potrebbe dimenticare qualcuna delle operazioni eseguite per la migrazione dei progetti dalla working directory alla directory di Git. In questi casi potrebbe essere di aiuto il comando git log
che consente di visualizzare una cronologia completa dei commit effettuati e ordinati a partire dal più recente:
A git log
è possibile passare differenti parametri che consentiranno di rendere più accurati gli output, alcune di queste opzioni verranno proposte nel corso dei prossimi capitoli, ma l'argomento -p
merita una segnalazione immediata, in quanto consente di visualizzare le differenze tra i diversi commit eseguiti. -p
potrà essere seguito da un valore numerico intero, in grado di limitare il numero dei commit visualizzati, ad esempio git log -p -3
mostrerà in output i soli ultimi 3 commit.
Una volta prodotto l'output di git log
non sarà possibile accedere direttamente alla linea di comando, per farlo si dovrà utilizzare la combinazione di tasti [ESC] + [:] + [q].