git commit
Il comando git commit
acquisisce un'istantanea delle modifiche attualmente previste nel progetto. Le istantanee salvate possono essere considerate versioni "sicure" di un progetto: Git non le cambierà mai a meno che tu non glielo chieda esplicitamente. Prima dell'esecuzione di git commit
, il comando git add viene utilizzato per promuovere o mettere in fase di "staging" le modifiche al progetto che verranno archiviate in un commit. Questi due comandi git commit
e git add
sono due dei più usati.
Commit Git e commit SVN a confronto
Sebbene condividano lo stesso nome, il commit git
e il commit svn
sono diversi. Questo termine condiviso può creare confusione per i nuovi arrivati di Git che hanno un background svn, ed è importante sottolineare la differenza. Confrontare il commit git
e il commit svn
significa confrontare un modello di applicazione centralizzato (svn) con un modello di applicazione distribuito (Git). In SVN, un commit invia le modifiche dal client SVN locale a un repository SVN condiviso e centralizzato remoto. In Git, i repository sono distribuiti, le istantanee vengono salvate nel repository locale e ciò non richiede assolutamente alcuna interazione con altri repository Git. I commit Git possono essere successivamente inviati a repository remoti arbitrari.
Come funziona
In generale, Git può essere considerato un'utilità per la gestione della cronologia. I commit sono le unità costitutive principali della cronologia di un progetto Git. I commit possono essere considerati istantanee o pietre miliari lungo la timeline di un progetto Git. I commit vengono creati con il comando git commit
per acquisire lo stato di un progetto in quel momento. Le istantanee Git vengono sempre salvate nel repository locale. Si tratta di un approccio fondamentalmente diverso da SVN, in cui viene eseguito il commit della copia di lavoro nel repository centrale. Al contrario, Git non ti obbliga a interagire con il repository centrale finché non sei pronto. Così come l'area di staging è un buffer tra la directory di lavoro e la cronologia del progetto, il repository locale di ogni sviluppatore è un buffer tra i suoi contributi e il repository centrale.
Cambia perciò il modello di sviluppo di base per gli utenti Git. Invece di apportare una modifica ed eseguirne il commit direttamente nel repository centrale, gli sviluppatori Git hanno l'opportunità di accumulare commit nel proprio repository locale. Ciò presenta molti vantaggi rispetto alla collaborazione in stile SVN: semplifica la suddivisione di una funzionalità in commit atomici, il raggruppamento dei commit correlati e la pulizia della cronologia locale prima di pubblicarla nel repository centrale. Inoltre, consente agli sviluppatori di lavorare in un ambiente isolato, rimandando l'integrazione fino a quando non si troveranno in un punto comodo per l'unione con altri utenti. Sebbene l'isolamento e l'integrazione differita siano vantaggiosi a livello individuale, è nell'interesse di un team integrarsi frequentemente e in piccole unità. Per maggiori informazioni sulle best practice per la collaborazione tra team Git, leggi come i team strutturano il loro flusso di lavoro Git.
materiale correlato
Branch Git
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
Istantanee, non differenze
A parte le distinzioni pratiche tra SVN e Git, anche la loro implementazione sottostante segue filosofie di progettazione completamente divergenti. Mentre SVN tiene traccia delle differenze di un file, il modello di controllo delle versioni di Git si basa sulle istantanee. Ad esempio, un commit SVN è costituito da un diff rispetto al file originale aggiunto al repository. Git, d'altra parte, registra l'intero contenuto di ogni file in ogni commit.
Questo rende diverse operazioni Git molto più veloci rispetto a SVN, dal momento che una particolare versione di un file non deve essere «assemblata» a partire dalle sue versioni diff: la revisione completa di ogni file è immediatamente disponibile dal database interno di Git.
Il modello snapshot di Git ha un impatto di vasta portata praticamente su ogni aspetto del suo modello di controllo delle versioni, influenzando tutto, dagli strumenti di ramificazione e unione ai flussi di lavoro di collaborazione.
Opzioni comuni
git commit
Esegui il commit dell'istantanea in staging. Verrà avviato un editor di testo che ti richiederà un messaggio di commit. Dopo aver inserito un messaggio, salva il file e chiudi l'editor per creare il commit effettivo.
git commit -a
Esegui il commit di un'istantanea di tutte le modifiche nella directory di lavoro. Vengono incluse solo le modifiche ai file tracciati (quelli che sono stati aggiunti con git add a
a un certo punto della loro cronologia).
git commit -m "commit message"
Un comando di scelta rapida che crea immediatamente un commit con un messaggio di commit passato. Per impostazione predefinita, git commit
aprirà l'editor di testo configurato localmente e richiederà l'inserimento di un messaggio di commit. Il passaggio dell'opzione -m
rinuncerà al prompt dell'editor di testo a favore di un messaggio in linea.
git commit -am "commit message"
Un comando di scelta rapida per utenti esperti che combina le opzioni -a
e -m
. Questa combinazione crea immediatamente un commit di tutte le modifiche organizzate e riceve un messaggio di commit in linea.
git commit --amend
Questa opzione aggiunge un altro livello di funzionalità al comando commit. Il passaggio di questa opzione modificherà l'ultimo commit. Invece di creare un nuovo commit, le modifiche in staging verranno aggiunte al commit precedente. Questo comando aprirà l'editor di testo configurato del sistema e richiederà di modificare il messaggio di commit specificato in precedenza.
Esempi
Salvare le modifiche con un commit
L'esempio seguente presuppone che tu abbia modificato alcuni contenuti in un file chiamato hello.py
nel branch corrente e che tu sia pronto a trasferirlo nella cronologia del progetto. Per prima cosa, devi creare lo staging del file con git add
, poi puoi salvare l'istantanea in staging.
git add hello.py
Questo comando aggiungerà hello.py
all'area di staging Git. Possiamo esaminare il risultato di questa azione usando il comando git status
.
git status
On branch main
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.py
Il nuovo file di output verde: hello.py
indica che hello.py
verrà salvato con il prossimo commit. Dal commit viene creato eseguendo:
git commit
Si aprirà un editor di testo (personalizzabile tramite git config
) che richiede un messaggio di log di commit, insieme a un elenco degli elementi del commit:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch main
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
#modified: hello.py
Git non richiede che i messaggi di commit seguano vincoli di formattazione specifici, ma il formato canonico consiste nel riassumere l'intero commit sulla prima riga in meno di 50 caratteri, lasciare una riga vuota, quindi inserire una spiegazione dettagliata di ciò che è stato modificato. Ad esempio:
Change the message displayed by hello.py
- Update the sayHello() function to output the user's name
- Change the sayGoodbye() function to a friendlier message
È prassi comune utilizzare la prima riga del messaggio di commit come un oggetto, simile a un'e-mail. Il resto del messaggio di log è considerato il corpo di testo e viene utilizzato per comunicare i dettagli del set di modifiche del commit. Nota: a molti sviluppatori piace anche usare il tempo presente nei propri messaggi di commit, che vengono quindi letti più come azioni sul repository. Ciò aiuta a rendere più intuitive molte delle operazioni di riscrittura della cronologia.
Come aggiornare (modificare) un commit
Per continuare con l'esempio hello.py
riportato sopra. Effettuiamo ulteriori aggiornamenti a hello.py
ed eseguiamo quanto segue:
git add hello.py
git commit --amend
Si aprirà ancora una volta l'editor di testo configurato. Questa volta, tuttavia, sarà precompilato con il messaggio di conferma che abbiamo inserito in precedenza. Ciò indica che non stiamo creando un nuovo commit, ma modificando l'ultimo.
Riepilogo
Il comando git commit
è una delle funzioni principali di Git. L'uso precedente del comando git add
è necessario per selezionare le modifiche che verranno inserite per il commit successivo. Quindi git commit
viene utilizzato per creare un'istantanea delle modifiche effettuate nella cronologia di un progetto Git. Scopri di più sull'utilizzo di git add nella pagina di accompagnamento. Il comando git status può essere usato per esplorare lo stato dell'area di staging e il commit in sospeso.
I modelli di commit di SVN e Git sono significativamente diversi ma spesso confusi tra loro, a causa della terminologia condivisa. Se arrivi a Git dopo aver utilizzato a lungo SVN, è bene sapere che in Git i commit sono economici e dovrebbero essere usati frequentemente. I commit SVN sono un'operazione costosa che effettua una richiesta remota, mentre i commit Git vengono eseguiti localmente e con un algoritmo più efficiente.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.