L'opzione Git commit –amend in Git


Lezione 30 / 53

L'opzione Git commit –amend in Git

Di Luca Ferretti


git guida git guida git italiano

Abbiamo detto più volte che lo scopo principale di Git è quello di evitare la perdita in una modifica committata (cioè salvata nella history). D’altro canto Git è anche pensato per offrire il controllo più completo sul proprio workflow di sviluppo, ivi inclusa la possibilità di definire esattamente la history del proprio progetto.

Prendiamo,ad esempio, questa cronologia di commit di un repository:

$ git log --oneline
5dd0865 make variable names more clear
35dec0e increase version
af75ac9 update indentation for checks from linter
edb709f profile mostly works, missing phone number
b2b95ad wip - unfinished
447cbfe (tag: v0.1.0) chore: release 0.1.0
67b2fd8 feat: implement login
66c8a99 feat: implement signup
8305e6c chore: init project

I commit successivi a quello con tag v0.1.0 sono stati fatti man mano che parti del lavoro venivano completate, per non perdere alcuni avanzamenti funzionanti. A distanza di mesi o anni, non tutti quei commit sarebbero interessanti da mantenere come “istantanea” del progetto.

Per situazioni come queste, Git offre dei comandi per poter riscrivere la history, rendendo però esplicito che l’uso di tali comandi può portare alla perdita di contenuto (anche se, in verità molto rara e molto raramente dovuta a Git stesso).

Git offre due possibili “ambiti” di riscrittura della history:
l’ultimo commit appena creato (tramite l’opzione --amend del comando git commit) oppure uno qualsiasi dei commit nella history (tramite il comando git amend)

Scopriamo come rendere la history d’esempio di sopra qualcosa di simile al seguente:

$ git log --oneline
9b23ede (tag: v0.2.0) chore: release 0.2.2
7a250a0 feat: implement profile page
447cbfe (tag: v0.1.0) chore: release 0.1.0
67b2fd8 feat: implement login
66c8a99 feat: implement signup
8305e6c chore: init project


 

Git commit –amend in Git

L’opzione --amend del comando git commit in Git è una scorciatoia che ci permette di unire nuove modifiche presenti nella staging area all’ultimo commit appena salvato.

In linea con la filosofia di Git, le nuove modifiche non vengono “aggiunte” al commit esistente, ma viene creato un nuovo commit che include tutte le modifiche.

[...]
$ git commit -m "implement send email button"
$ git log -n 2 --oneline
cc7f96f (HEAD -> main) implement new feature
a3478b1 fix a bug in old feature
$ git add public/icons/send_email_button.png
$ git commit --amend --no-edit
$ git log -n 2 --oneline
e34a234 (HEAD -> main) implement new feature
a3478b1 fix a bug in old feature

Nella sequenza di comandi qui sopra è stato incluso un file all’ultimo commit effettuato. Il file da includere è stato aggiunto alla staging area (git add) e poi è stato eseguito git commit --amend. In questa situazione, in cui si è semplicemente dimenticato di includere un file in un commit (l’intero file o modifiche a file già sotto controllo di versione), è d’aiuto anche l’opzione --no-edit che istruisce Git a mantenere l’esistente messaggio di commit.

Notare l’output di git log prima e dopo dell’amend: l’id dell’ultimo commit è cambiato, per Git si tratta di una nuovo snapshot che sostituisce il precedente.

Se non si indica l’opzione --no-edit, il comando git commit --amend può anche essere utile per correggere eventuali errori o mancanza nel solo messaggio di commit.

Guida Git in italiano 1 Che cos'è Git? 2 Nascita di Git 3 Principali caratteristiche di Git 4 Riga di comando e UI in Git 5 Come Installare Git 6 5 comandi Git per sviluppatori singoli 7 5 comandi Git per sviluppare collaborando 8 Repository in Git 9 Commit in Git 10 Working Copy in Git 11 Staging Area in Git 12 Branch in Git 13 Remote in Git 14 Inizializzare un nuovo repository con git init 15 Creare una copia di un repository remoto in Git con git clone 16 Configurare le opzioni di Git con git config 17 Il comando Git add in Git 18 Il comando Git commit in Git 19 Il comando Git diff in Git 20 Il comando Git stash in Git 21 .gitignore : i file ignored in Git 22 Il comando Git status in Git 23 il comando Git log in Git 24 Il comando Git tag in Git 25 Il comando Git blame in Git 26 Il comando Git checkout in Git 27 Il comando Git revert in Git 28 Il comando Git reset in Git 29 Il comando Git rm in Git 30 L'opzione Git commit –amend in Git 31 Git rebase –interactive in Git 32 Scorciatoie per comandi frequenti in Git 33 Repository condiviso in Git 34 Il modello Fork & pull 35 Il comando Git remote in Git 36 I principali repository remote di Git: Github, Gitlab e Bitbucket 37 Il comando Git fetch in Git 38 Il comando Git push in Git 39 Il comando Git pull in Git 40 Il comando Git branch in Git 41 Il comando Git checkout in Git 42 Il comando Git merge in Git 43 Risolvere un merge conflict in Git 44 Capire meglio il contenuto dei commit durante un conflitto di merge in Git 45 Workflow Git centralizzato 46 Workflow Git feature branching 47 Workflow Git trunk-based 48 Approccio “forking” in Git 49 Gitflow in Git 50 Messaggi di commit in Git 51 Tagging & Versioning in Git 52 L’opzione merge in Git 53 L’opzione rebase in Git
Scopri i corsi

Le nostre guide possono essere molto utili per muovere i primi passi nel mondo della programmazione, ma se vuoi iniziare una nuova carriera in ambito digital & tech con il supporto costante dei docenti e tantissime esercitazioni pratiche, ti consigliamo di frequentare uno dei corsi della nostra Hackademy!

Scopri i corsi