Guida verificata con Ubuntu: 22.04 24.04

Problemi in questa pagina? Segnalali in questa discussione

Introduzione

In questa pagina viene illustrato l'utilizzo dei comandi e l'uso degli strumenti di monitoraggio integrati per seguire l'evoluzione del progetto.

Il commit è l'operazione fondamentale di Git che permette di aggiungere, rimuovere, modificare e registrare lo stato dei file nel database del repository.

Strumenti di monitoraggio predefiniti

Si ricorda che tutte le operazioni di gestione del repository (commit, visualizzazione cronologia, gestione branch, ecc.) devono essere eseguite posizionandosi all'interno della directory del progetto (ad esempio tramite il comando cd ~/gitproject). In questo modo Git può accedere alla sottocartella nascosta .git necessaria per il corretto funzionamento dei comandi.

Git fornisce due comandi essenziali per controllare il flusso di lavoro:

Flusso di lavoro

Il salvataggio delle modifiche in Git avviene in due fasi: l'aggiunta all'area di staging (preparazione) e il commit (registrazione definitiva).

Preparazione dei file (Stage)

  1. Creare un file denominato README, digitando nel terminale il seguente comando:

     echo "Inizio progetto" > README
  2. Verificare lo stato con git status. Il file apparirà come untracked (non tracciato) ovvero che non viene tenuto in conto dal repository. Verrà restituito il messaggio:

     Sul branch master
    
     Non ci sono ancora commit
    
     File non tracciati:
       (usa "git add <file>..." per includere l'elemento fra quelli di cui verrà eseguito il commit)
             README
    
     non è stato aggiunto nulla al commit ma sono presenti file non tracciati (usa "git add" per tracciarli)
  3. Aggiungere il file all'area di staging:

     git add README
  4. Controllando nuovamente lo stato con git status, il file risulterà:

     Sul branch master
    
     Non ci sono ancora commit
    
     Modifiche di cui verrà eseguito il commit:
       (usa "git rm --cached <file>..." per rimuovere gli elementi dall'area di staging)
             nuovo file:             README

    Adesso il file si trova nello stato di stage, ovvero è pronto per essere committato all'interno del repository.

    • In breve i file in stato stage sono quelli pronti per essere committati, le cui modifiche verranno salvate nel repository.

Registrazione (Commit)

Per applicare le modifiche fatte si utilizza il comando commit con i seguenti flag:

Effettuare il commit

Procedere quindi con il commit.

  1. Digitare nel terminale il seguente comando:

     git commit -a -m "README aggiunto"

    Si visualizzerà il messaggio:

     [master (commit radice) ba12845] README aggiunto
      1 file changed, 1 insertion(+)
      create mode 100644 README
  2. Controllare lo status:

     git status

    che restituirà:

     Sul branch master
     non c'è nulla di cui eseguire il commit, l'albero di lavoro è pulito

    Lo stato è in clean, ovvero la nostra cartella adesso è allineata col repository (dato che si sono appena sincronizzati).

Controllo del log

Il controllo del log è possibile attraverso il comando standard git log, tuttavia viene qui mostrata l'utilità di aver creato l'alias git lg.

Aggiunta di altri file

Vengono qui aggiunti ulteriori file al progetto come un file sorgente minimale /src/main.cpp e un makefile /Makefile.

Creazione file

  1. Digitare i seguenti comandi (ogni blocco rappresenta un unico comando):

    mkdir src
    printf '#include <iostream>\nint main() {\n\tstd::cout << "Benvenuti su Git!" << std::endl;\n\treturn 0;\n}\n' > src/main.cpp
    echo 'vpath %.cpp ./src'$'\n'$'\n''src = main.cpp'$'\n\n''objects = $(patsubst %.cpp,obj/%.o,$(src))'$'\n\n''$(objects): | obj'$'\n\n''obj:'$'\n\t''@mkdir -p $@'$'\n\n''obj/%.o : %.cpp'$'\n\t''@echo $<'$'\n\t''@$(CXX) $(CXXFLAGS) -c $< -o $@'$'\n\t''mkdir bin'$'\n\t''@$(CXX) $(LDFLAGS) -o bin/main $(objects)'$'\n\n''clean:'$'\n\t''rm -fr bin/ obj/'$'\n' > Makefile
  2. Il comando:

     ls -altr

    dovrebbe riportare la seguente situazione:

     totale 24
     drwxr-x--- 27 mario mario 4096 feb 17 01:04 ..
     -rw-rw-r--  1 mario mario   16 feb 17 00:51 README
     drwxrwxr-x  8 mario mario 4096 feb 17 00:59 .git
     drwxrwxr-x  2 mario mario 4096 feb 17 01:10 src
     -rw-rw-r--  1 mario mario  258 feb 17 01:11 Makefile
     drwxrwxr-x  4 mario mario 4096 feb 17 01:11 .
  3. Creare l'eseguibile digitando i comandi:

     make
  4. Il comando:

     bin/main

    dovrebbe restituire il messaggio:

     Benvenuti su Git!
  5. Visualizzare il nuovo status con git status, digitando:

     git status

    verrà visualizzato:

     Sul branch master
     File non tracciati:
       (usa "git add <file>..." per includere l'elemento fra quelli di cui verrà eseguito il commit)
             Makefile
             bin/
             obj/
             src/
    
     non è stato aggiunto nulla al commit ma sono presenti file non tracciati (usa "git add" per tracciarli)

    Dato che non sono stati modificati file pre-esistenti, ma creati di nuovi (Git sta mostrando le cartelle create), dobbiamo come nel caso precedente aggiungere a mano i file che ci servono.

In questo caso per i fini del progetto non serve aggiungere tutti i file. I file object infatti non servono, dato che vengono creati ogni volta dalla compilazione, così come l'eseguibile. Non ha senso metterli sotto configurazione ed è anche dannoso (a lungo andare i file binari aumenteranno le dimensioni del repository).
È possibile cancellarli a mano, ma andrebbe fatto ogni volta. Oppure potrebbero essere non aggiunti al repository, ma rimarrebbero sempre in mezzo.

Git permette di filtrare i file che non vogliamo, utilizzando .gitignore nel prossimo paragrafo.

.gitignore

Il file gitignore permette di specificare quali file devono essere esclusi dal repository. È un semplice file di testo con un pattern per riga. Deve essere creato nella root del repository, dove si trova .git. I pattern possono essere file o cartelle. Nel nostro caso escluderemo la cartella bin e i file oggetto .o.

  1. Creare il file:

     echo 'bin/'$'\n''*.o'$'\n' > .gitignore
  2. Il comando:

     cat .gitignore

    dovrebbe restituire le seguenti stringhe:

     bin/
     *.o

    Nella prima riga viene esclusa la cartella bin (per escludere cartelle occorre mettere / alla fine), e tutti i file con estensione .o.

  3. Analizzare lo status:

     git status

    Risulterà:

     Sul branch master
     File non tracciati:
       (usa "git add <file>..." per includere l'elemento fra quelli di cui verrà eseguito il commit)
             .gitignore
             Makefile
             src/
    
     non è stato aggiunto nulla al commit ma sono presenti file non tracciati (usa "git add" per tracciarli)

    in cui si vede come ora siano assenti i file inclusi in .gitignore.

Modifiche al repository

  1. Aggiungere tutti i file. Per evitare di scrivere a mano ogni file, è possibile utilizzare il simbolo "." per indicarli tutti:

     git add .
  2. Eseguire il commit:

     git commit -a -m "Aggiunti sorgenti e Makefile"

    verrà restituito il seguente output

     [master b7c1ae2] Aggiunti sorgenti e Makefile
      3 files changed, 28 insertions(+)
      create mode 100644 .gitignore
      create mode 100644 Makefile
      create mode 100644 src/main.cpp
  3. Lo status:

     git status

    restituisce le seguenti stringhe:

     Sul branch master
     non c'è nulla di cui eseguire il commit, l'albero di lavoro è pulito
  4. Il log:

     git lg

    ha come output:

     * b7c1ae2 (HEAD -> master) - Mario Rossi : Aggiunti sorgenti e Makefile (2 minuti fa)
     * ba12845 - Mario Rossi : README aggiunto (27 minuti fa)
    Il contenuto della cartella è sincronizzato col repository, ed è stato aggiunto il commit fra i log.

Modifiche a file esistenti

Viene qui modificato il file /src/main.cpp, già presente nel repository.

  1. Digitare il seguente comando in modo che venga mostrata la data nel messaggio:

     sed -i "s/Benvenuti/`date`: Benvenuti/" src/main.cpp
  2. Per avere conferma digitare:

     cat src/main.cpp

    il cui output sarà tipo:

     #include <iostream>
     int main() {
             std::cout << "sab 17 feb 2024, 01:26:54, CET: Benvenuti su Git!" << std::endl;
             return 0;
     }
  3. Digitare quindi i comandi:

     make clean
     make
  4. Eseguendo:

     bin/main

    verrà stampato il messaggio di benvenuto:

     sab 17 feb 2024, 01:26:54, CET: Benvenuti su Git!

Nuovo commit e nuova situazione

  1. Verificare la nuova situazione di partenza:

     git status

    il risultato sarà:

     Sul branch master
     Modifiche non nell'area di staging per il commit:
       (usa "git add <file>..." per aggiornare gli elementi di cui sarà eseguito il commit)
       (usa "git restore <file>..." per scartare le modifiche nella directory di lavoro)
             modificato:             src/main.cpp
    
     nessuna modifica aggiunta al commit (usa "git add" e/o "git commit -a")

    Il file src/main.cpp è stato modificato ma le modifiche non sono ancora state registrate nel repository. Per farlo, occorre committare il file (si evita di parlare dello stash in questa fase).

  2. Eseguire il commit, digitare il comando:

     git commit -a -m "Aggiunta data in stampa."

    che restituirà:

     [master 5b235ad] Aggiunta data in stampa.
      1 file changed, 1 insertion(+), 1 deletion(-)
  3. Controllare lo stato del repository:

     git status

    il cui output risulta:

     Sul branch master
     non c'è nulla di cui eseguire il commit, l'albero di lavoro è pulito
  4. In fine consultare il log:

     git lg

    che riporta:

     * 5b235ad (HEAD -> master) - Mario Rossi : Aggiunta data in stampa. (68 secondi fa)
     * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (8 minuti fa)
     * ba12845 - Mario Rossi : README aggiunto (34 minuti fa)
    Il repository è ora sincronizzato col contenuto della cartella e il commit con le modifiche è stato aggiunto.

Risoluzioni problemi

GPG signature

Alcune configurazioni di Git richiedono che ogni commit sia firmato digitalmente. L'operazione Git fallisce perché il password store (QtPass) non riesce a firmare il commit.

Disattivare temporaneamente l'obbligo di firma per il repository delle password o configurare correttamente l'ID della chiave GPG nel file .gitconfig:

git config --global user.signingkey ID_CHIAVE_GPG
git config --global commit.gpgsign true

Se si preferisce non firmare i commit del password store, eseguire:

git config commit.gpgsign false

Ulteriori risorse


CategoryProgrammazione

Programmazione/Git/Commit (l'ultima modifica è del 24/06/2026 09.17.48, fatta da ivantu)