# Tutorial Git: primi passi con il sistema di controllo delle versioni

Lo **sviluppo** congiunto **di progetti software** non si verifica solo all’interno delle aziende: anche nel **settore open source**, a seconda delle dimensioni del progetto, da diverse centinaia a migliaia di volontari partecipano alla manutenzione, ottimizzazione, sviluppo e modifica di un programma. Senza un adeguato **sistema di registrazione e controllo** delle numerose modifiche da parte dei diversi sviluppatori tali progetti difficilmente potrebbero essere realizzati.

Una delle soluzioni più popolari per il controllo di versione è il tool Git non soggetto a licenza, semplice da imparare e completamente gratuito. In questo tutorial vi forniremo tutte le nozioni di base di Git necessarie per **iniziare con il programma di controllo delle versioni**.

## Che cos’è Git?

Git è un sistema di controllo versione sviluppato nel 2005 dal creatore di Linux, Linus Thorvalds, e rilasciato sotto licenza GNU-GPLv2 gratuita. La particolarità dello strumento è che sebbene esista un **repository centrale** per ciascun progetto, tutti gli utenti coinvolti scaricano una **copia locale di lavoro** di questa directory sul proprio dispositivo di lavoro. Ognuna di queste copie rappresenta un back-up completo del repository, per cui non è necessaria una connessione di rete continua per il processo di lavoro di base. Inoltre le copie fungono da back-up nel caso in cui la directory principale non dovesse funzionare o è danneggiata. Le **modifiche** effettuate possono essere **condivise** in qualsiasi momento **con tutti gli altri partecipanti al progetto** e, se opportuno, possono essere inserite nel repository.

---

### Consiglio

Una delle alternative a Git più conosciute è il tool **Subversion**, anch’esso open source, meglio noto come **SVN**, che a differenza di Git si basa su un **sistema centrale di controllo**. Nell’articolo ["Git vs. SVN - Controllo di versione a confronto](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/git-vs-svn-controllo-di-versione-a-confronto/ "Git vs. SVN: controllo di versione a confronto")*["](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/git-vs-svn-controllo-di-versione-a-confronto/ "Git vs. SVN: controllo di versione a confronto")* scoprirete le analogie e le differenze di questi due strumenti.

---

## Ecco come installare Git sul vostro dispositivo

Chi desidera apprendere la gestione del software con Git dovrebbe innanzitutto familiarizzare con il software e la relativa interfaccia utente. Git è disponibile per Windows, Unix/Linux e macOS, tenendo conto che le diverse versioni si differenziano leggermente tra loro per quanto riguarda il funzionamento. Dopo l’installazione standard potete controllare lo strumento, indipendentemente dalla piattaforma, sia con l’interfaccia a riga di comando che con un’interfaccia utente grafica.

---

### N.B.

Per poter utilizzare i comandi citati più avanti in questo tutorial Git, gli utenti di Windows dovrebbero eseguire il sistema di controllo versione tramite **Git-Bash**, la shell in stile Unix inclusa nell’installazione. In alternativa è anche possibile controllare il software con il prompt dei comandi o tramite il terminale di Windows, anche se qui la struttura dei parametri dei comandi funziona diversamente (ad esempio virgolette doppie invece di virgolette singole).

---

[YouTube video](https://www.youtube.com/watch?v=Nv2rpfO4PY4)        Sull’[homepage del progetto Git](https://git-scm.com/downloads "git-scm.com: pagina web del progetto Git") si trovano **file di installazione binari, istruzioni per l’installazione del gestore pacchetti (sistemi Unix) e edizioni portatili pronte all’uso** per i singoli sistemi. È sufficiente scaricare il pacchetto desiderato o utilizzare il pacchetto giusto della gestione pacchetti e seguire le istruzioni della procedura guidata di installazione. L’edizione portatile non prevede l’installazione.

---

### Consiglio

Nella [sezione dei download di git-scm.com](https://git-scm.com/downloads/guis/ "GUIs per Git") la community Git mette a vostra disposizione varie **interfacce grafiche alternative** per il gestore delle versioni. Lì trovate anche i client Git per **Android** e **iOS** che consentono l’utilizzo dello strumento open source sul vostro dispositivo mobile.

---

## Tutorial Git: come lavorare con Git passo dopo passo

Una volta installato Git sul vostro sistema, potrete utilizzarlo per la gestione dei vostri progetti. Ma come con qualunque software è necessario innanzitutto **conoscere** le **funzioni** e i **comandi** elementari per trarre il massimo beneficio dall’applicazione. Nell’ambito del nostro tutorial per principianti illustreremo i passaggi chiave della **configurazione di Git e del suo funzionamento tramite la riga di comando**, in modo che in seguito possiate configurare e controllare facilmente il vostro repository.

---

### N.B.

Dal 2015 è noto che un’**errata configurazione di Git** o del server web utilizzato per il repository del sistema di controllo delle versioni li rende accessibili pubblicamente tramite browser. È sempre il caso quando una **directory Git si trova nella root del server**, il che dovrebbe essere evitato a tutti i costi. Non memorizzate mai i vostri repository Git nella root o, in alternativa, configurate il vostro server web in modo che l’accesso alla directory .git sia impossibile a terzi non autorizzati. Una descrizione dettagliata del problema e le istruzioni su come risolvere questo problema con Git nei server web più comuni si trovano sul [sito della fondazione Internetwache.org](https://en.internetwache.org/dont-publicly-expose-git-or-how-we-downloaded-your-websites-sourcecode-an-analysis-of-alexas-1m-28-07-2015/ "Istruzioni su come risolvere il problema con Git su Internetwache.org").

---

### Creare o clonare il repository Git

Il repository Git è la directory centrale di un progetto gestito e quindi anche il punto di contatto centrale per tutti i partecipanti, attraverso il quale viene regolamentato il controllo completo della versione. Pertanto il vostro primo passo in Git è **creare una directory principale** **o clonarla** (sotto forma di una copia di lavoro) se aderite a un progetto il cui sviluppo congiunto è controllato con l’ausilio di Git.

Se desiderate configurare nuovamente il controllo di versione o avete semplicemente installato lo strumento per imparare a lavorare con Git, conviene innanzitutto ricostituire un repository. Per far questo utilizzate “cd” (***c****hange* ***d****irectory*) per passare alla **directory locale desiderata** sul vostro dispositivo:

```none
cd percorso individuale di directory
```

Per **generare una directory .*git*** eseguite ora il seguente comando:

```none
git init
```

[![Immagine: Git Bash: cambio directory e generazione repository](https://www.ionos.it/digitalguide/fileadmin/_processed_/8/1/csm_git-tutorial-1_8ddb81ffec.webp "Git Bash: cambio directory e generazione repository")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-1.jpg) Git Bash: cambio directory e generazione repository.     Se il repository Git per il vostro progetto esiste già, vi occorre solo l’**indirizzo web o di rete di questa directory** per creare con il comando ”**git clone**“ una **copia di lavoro** sul vostro computer:

```none
git clone https://one-test.website/git-repository
```

---

### N.B.

Git supporta diversi protocolli di trasmissione. In alternativa all’[HTTPS](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/cose-https/ "Cos’è HTTPS?") utilizzato nell’esempio potete usare anche [SSH](https://www.ionos.it/digitalguide/server/tools-o-strumenti/ssh/ "SSH") per accedere al repository, purché disponiate della relativa autorizzazione.

---

### Controllare lo stato del repository e aggiungere nuovi file per il controllo versione

Tra i principali fondamenti di Git c’è una buona organizzazione della propria directory di lavoro. Tramite questa non solo proponete **modifiche e innovazioni personali** a un progetto, che vengono poi acquisite tramite commit (“*attivazione*”), ma ottenete anche **informazioni sulle attività di altri utenti**. Potete verificare l’aggiornamento della vostra copia di lavoro mediante la seguente voce:

```none
git status
```

Nel caso di un repository appena creato o di una corrispondenza assoluta di directory principale e copia di lavoro di solito il programma informa che non ci sono stati nuovi aggiornamenti al progetto (“*No commits yet*”) e annuncia che al momento non sono state condivise modifiche personali per il prossimo commit (“*nothing to commit*”).

[![Immagine: Git Bash: verifica dello stato del repository Git](https://www.ionos.it/digitalguide/fileadmin/_processed_/d/b/csm_git-tutorial-2_7400b70e7d.webp "Git Bash: verifica dello stato del repository Git")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-2.jpg) Git Bash: verifica dello stato del repository Git.       Per **aggiungere** un nuovo **file di controllo delle versioni** o **registrare** un file modificato **per il prossimo commit** applicate il comando “**git add**” a questo file (deve trovarsi nella directory di lavoro). Nel nostro tutorial Git apportiamo come esempio un documento di testo chiamato “Test”:

```none
git add Test.txt
```

Se si controlla nuovamente lo stato del repository il documento di esempio verrà presentato come potenziale candidato **per la successiva fase di modifica ufficiale** del progetto (“*Changes to be commited*“):

[![Immagine: Git Bash: verifica dello stato dopo le modifiche alla copia di lavoro](https://www.ionos.it/digitalguide/fileadmin/_processed_/e/d/csm_git-tutorial-3_e2f3c6923a.webp "Git Bash: verifica dello stato dopo le modifiche alla copia di lavoro")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-3.jpg) Git Bash: verifica dello stato dopo le modifiche alla copia di lavoro.       ###  Confermare le modifiche tramite commit e includerle nell’HEAD

Come descritto nel paragrafo precedente, tutte le modifiche che avete registrato per il controllo versione devono sempre essere confermate tramite commit affinché siano **incluse nell’HEAD**. L’HEAD è una sorta di indice che punta all’ultimo commit effettuato nel vostro attuale ambiente di lavoro Git (noto anche come “branch”). Il comando per questo passaggio è:

```none
git commit
```

---

### N.B.

Verificate sempre, prima di immettere il comando, se tutte le innovazioni desiderate per il commit siano state contrassegnate come tali (dunque con “git add”). In caso contrario saranno ignorate anche se si trovano nella directory della copia di lavoro.

---

Dopo l’esecuzione del comando, **Git avvia automaticamente l’editor** che avete indicato come scelta predefinita durante l’installazione o che il tool di controllo versione prevede come standard. Ora è possibile inserire nel documento un **singolo commento** sul commit pianificato, in cui le righe già incluse sono commentate da un punto e virgola e quindi non saranno visualizzate in seguito. Non appena **chiudete l’editor** Git crea il commit:

[![Immagine: Tutorial Git: output Git Bash dopo il comando “git commit“](https://www.ionos.it/digitalguide/fileadmin/_processed_/0/8/csm_git-tutorial-4_fd7dfd4d17.webp "Tutorial Git: output Git Bash dopo il comando “git commit“")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-4.jpg) Output Git Bash dopo il comando “git commit“.       Come mostra lo screenshot, dopo aver eseguito “git commit” ricevete un messaggio riepilogativo sul commit: le parentesi quadre anteposte contengono da un lato il **nome del branch** (ramo del progetto; qui “master” poiché la nostra directory di lavoro è anche la directory principale), in cui vengono trascritte le modifiche, dall’altro il **checksum SHA-1** del commit (qui “c0fdc90“). Seguiranno il commento liberamente scelto (qui "test") e informazioni concrete sulle modifiche apportate.

### Modificare i commit generati o annullarli

Se avete apportato modifiche sotto forma di un commit, potete rivedere il contenuto in qualsiasi momento o revocarlo del tutto. Un caso tipico, in cui sono necessari degli aggiornamenti, è ad esempio quello in cui il commit è stato generato troppo presto e sono stati dimenticati alcuni file o modifiche importanti. In tal caso è necessario fornire **a posteriori** tramite “git add” i file nuovi o adattati e ripetere l’inserimento nel repository principale. Per far questo aggiungete al comando standard l’opzione **--amend**:

```none
git commit --amend
```

Se desiderate invece **revocare** l’ultimo **commit** generato, potete farlo con il seguente comando Git:

```none
git reset --soft HEAD~1
```

Con questo comando viene revocato l’ultimo commit inserito nell’HEAD. I file in esso contenuti sono quindi **reimpostati** allo stato “modifiche pianificate per il prossimo commit”. Se invece i dati di lavoro devono **essere completamente eliminati** utilizzate il seguente comando al posto del precedente:

```none
git reset --hard HEAD~1
```

### Visualizzare la cronologia di Commit

È importante imparare la gestione del progetto con Git, in particolare per le funzionalità elementari di Versioning. Un enorme punto a favore di questo sistema open source è il fatto che in qualsiasi momento è possibile visualizzare le **ultime modifiche apportate al repository**. Il comando Git richiesto è:

```none
git log
```

Il comando “git log“ elenca i commit generati in ordine cronologico inverso, per cui sono visualizzati per impostazione predefinita il **checksum SHA-1**, l’**autore** (nome e indirizzo di posta elettronica) e la **data del relativo commit**. Inoltre, ovviamente, è possibile visualizzare anche **il singolo messaggio** che serve a voi e ad altri utenti come indicatore decisivo per classificare rapidamente i singoli cambiamenti. Nel nostro tutorial Git abbiamo precedentemente generato un singolo commit con il messaggio “test”, che il comando, come richiesto, visualizza anche durante l’esecuzione:

[![Immagine: Tutorial Git: cronologia di commit con una voce](https://www.ionos.it/digitalguide/fileadmin/_processed_/8/8/csm_git-tutorial-5_748b3e97fd.webp "Tutorial Git: cronologia di commit con una voce")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-5.jpg) Tutorial Git: cronologia di commit con una voce.       Inoltre il comando log può essere modificato utilizzando diversi parametri. Nella seguente tabella sono elencate alcune opzioni utili:

<table>
  <thead>
    <tr>
      <th>Opzione per il comando “git log“</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>-p</td>
      <td>visualizza anche le modifiche contenute in un commit</td>
    </tr>
    <tr>
      <td>-2</td>
      <td>elenca solo gli ultimi due commit eseguiti</td>
    </tr>
    <tr>
      <td>--stat</td>
      <td>aggiunge a ogni voce una breve statistica, che mostra quali file sono stati modificati e quante righe sono state aggiunte o rimosse</td>
    </tr>
    <tr>
      <td>--pretty</td>
      <td>modifica il formato dell’output, per cui sono disponibili diversi formati; --pretty=oneline è per esempio un possibile formato che elenca tutti i commit in una singola riga</td>
    </tr>
    <tr>
      <td>--abbrev-commit</td>
      <td>visualizza soltanto i primi caratteri di un checksum SHA-1</td>
    </tr>
    <tr>
      <td>--relative-date</td>
      <td>visualizza la data di una modifica nel relativo formato (per esempio “due settimane fa“)</td>
    </tr>
  </tbody>
</table>

### Registrare i commit nel repository principale

Fin qui vi abbiamo mostrato in questo tutorial Git in che modo memorizzare le modifiche come commit nell’HEAD della directory locale. Ma affinché siano registrate anche **nel repository principale** è necessario immettere il seguente comando:

```none
git push origin master
```

Con questo comando **Git trasferisce automaticamente tutti i commit creati**, finora presenti solo nella copia di lavoro, **nella directory principale**, chiamata anche “master”. Se nel codice indicato si sostituisce questo nome con quello di un altro branch (ramo del progetto) i file verranno inviati direttamente li.

### Tagging: creare, eliminare ed elencare tag in Git

Come molti altri sistemi di controllo versione anche Git dispone di una funzione di tagging, che consente di **contrassegnare come importanti dei punti selezionati nella cronologia di un repository**. Di solito questi tag sono utilizzati per identificare le pubblicazioni di un software come versione 1.0, 2.0 ecc., affinché possano essere recuperate facilmente anche nei progetti di grandi dimensioni. Al riguardo Git supporta due tipi di tag:

- **I tag annotati** (“*annotated*“) sono memorizzati come oggetti autonomi nel database inclusi il proprio checksum, il messaggio di tagging, la data, il nome e l’indirizzo di posta dell’autore del tag, nonché la firma GNU Privacy Guard opzionale (firma GPG).
- **I tag non annotati** (“*lightweight*“), proprio come i branch, fungono solo da riferimento a un commit. Questo tipo è utile se sono necessari solo tag temporanei o non si desidera salvare le informazioni aggiuntive.

**I tag annotati** sono creati in Git utilizzando il comando “**git tag -a**“ sul commit richiesto. Se si aggiunge anche il parametro “**m**” è possibile formulare il **messaggio tagging** desiderato, posto tra virgolette, direttamente nell’interfaccia a riga di comando. In questo tutorial Git abbiamo generato il commit “test”, che a tal fine associamo anche a un tag che include il messaggio “example tag”:

```none
git tag -a Test -m "example tag"
```

---

### N.B.

Se nella creazione del tag rinunciate al parametro “–m”, Git apre automaticamente l’editor, in modo che possiate inserirvi il messaggio tagging desiderato.

---

Per i **tag non annotati** procedete in modo simile, utilizzando però solo il comando di base “**git tag**” sul commit desiderato e rinunciando ad altri parametri. Riferito al nostro esempio il comando da eseguire è il seguente:

```none
git tag Test
```

Non appena i tag saranno disponibili per il vostro repository, potrete visualizzarli con il “**git tag**“ già noto e i parametri opzionali “**-l**“ o “**--list**“:

```none
git tag
git tag -l
git tag --list
```

[![Immagine: Tutorial Git: elenco dei tag disponibili per il repository](https://www.ionos.it/digitalguide/fileadmin/_processed_/3/4/csm_git-tutorial-6_b5d46d48aa.webp "Tutorial Git: elenco dei tag disponibili per il repository")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-6.jpg) Il comando “git tag“ visualizza il tag precedentemente creato per l’esempio commit “test”.     Per **eliminare un tag dalla directory di lavoro locale** applicate la stringa di comando “**git tag -d**“. Il nostro riferimento a “test” viene rimosso come segue:

```none
git tag -d Test
```

Per inciso, anche i tag come i commit devono essere trasferiti manualmente nella directory principale. Per far questo sono necessari il nome del tag e il comando “**git push origin**“. Ma al posto del nome del tag potete anche inserire il parametro “**--tags**“, tramite il quale tutti i tag generati vengono registrati nel repository:

```none
git push origin --tags
```

### Creare, gestire ed eliminare branch

I branch già citati in questo tutorial Git rappresentano in linea di principio solo singole **versioni di lavoro del repository principale**, classificato a sua volta come branch, con il nome “master”. Con questi rami di lavoro Git fornisce la base perfetta per sviluppare caratteristiche e funzioni separate l’una dall’altra e unificarle solo in un momento successivo. Quest’ultima operazione viene denominata anche “**merge**“ (dall’inglese to merge “unire“).

Non è difficile **creare un nuovo branch**: vi occorre solo l’indicazione “**git branch**” alla quale aggiungere l’etichetta desiderata per il ramo. È possibile creare un branch di esempio chiamato “**test\_branch**” nel modo seguente:

```none
git branch test_branch
```

È quindi possibile passare a questo branch in qualsiasi momento con il comando "**git checkout**":

```none
git checkout test_branch
```

[![Immagine: Tutorial Git: cambio di branch tramite Git Bash](https://www.ionos.it/digitalguide/fileadmin/_processed_/3/4/csm_git-tutorial-6_b5d46d48aa.webp "Tutorial Git: cambio di branch tramite Git Bash")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-6.jpg) Dopo aver modificato correttamente il branch Git presenta il messaggio “Switched to branch …“ (it. “passato al branch…”.     Se desiderate unificare i branch potete farlo con il comando “**git merge**“. Andate innanzitutto tramite “**checkout**” alla directory che deve registrare un altro ramo e lì eseguite il comando citato, compreso il nome del branch da registrare. Ad esempio la nostra versione di lavoro “test\_branch” può essere **unificata nel repository principale** nel seguente modo:

```none
git checkout master
git merge test_branch
```

Se avete unificato i rami di lavoro e quindi un **determinato branch** non vi serve più, potete semplicemente eliminarlo. Per far questo utilizzate la stringa di comando “**git branch -d**“ sul ramo della versione che non vi serve più. Con questo input potete eliminare Il nostro esempio del tutorial Git “test\_branch“:

```none
git branch -d test_branch
```

Unico **presupposto per il processo di rimozione**: dovete essere in un altro branch. Prima dell’esecuzione del comando siamo passati al repository principale, come potete vedere nello screenshot seguente:

[![Immagine: Cambio di branch e rimozione tramite Git Bash](https://www.ionos.it/digitalguide/fileadmin/_processed_/3/6/csm_git-tutorial-8_a15d6804b1.webp "Cambio di branch e rimozione tramite Git Bash")](https://www.ionos.it/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/git-tutorial-8.jpg) Git conferma la rimozione di un branch con il messaggio “Deleted branch …“.       ---

### Consiglio

Nel Digital Guide troverete anche informazioni su: "[Git Branch: come rinominare i rami locali e remoti](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/rinominare-i-rami-git/ "Rinominare i rami Git")".

---


This is a markdown version of: [https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/tutorial-git/](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/tutorial-git/) for AI/LLM consumption.