Il comando Git reset in Git


Lezione 28 / 53

Il comando Git reset in Git

Di Luca Ferretti


git guida git guida git italiano

Similmente al precedente, il comando git reset in Git permette di annullare commit di un repository, ma lo fa in maniera distruttiva. In particolare, git reset può operare sulla history dei commit, quindi permette di alterare la history di un determinato branch. È un comando da usare con attenzione se non si vuole perdere parte del proprio lavoro.

Infatti, il comando è descritto ufficialmente come git-reset - Reset current HEAD to the specified state e in base all’effettivo utilizzo permette di effettuare il “reset” di diverse situazioni. Infatti, oltre che sulla history dei commit, ha effetto anche sulla staging area e sulla working directory a seconda della modalità con cui viene eseguito (soft, mixed o hard).

La versione estesa del comando è la seguente:

git reset [--soft|--mixed|--hard] [<REFERENCE>]

in particolare, se non indicati, viene usata di default la modalità mixed e viene usata la HEAD attuale come reference.

Le tre modalità differiscono nel seguente modo:

  • soft - non tocca le modifiche in staging area, non tocca le modifiche nella working directory
  • mixed - togliere le modifiche dalla staging aree e le riporta nella working directory, non tocca le altre eventuali modifiche nella working directory
  • hard - annulla le modifiche in staging area, annulla le modifiche in working directory (cioè rimuove per sempre ogni modifica non salvata come commit)
     
$ git log --oneline
* 517c168 (HEAD -> master) Revert "improve performance on first feature"
* 1e6ed4a add second feature
* cc7f96f improve performance on first feature
* 1e1bf33 add first feature
* f6a76e4 initialize project
$ git add second.py
$ git status --short
M first.py
M  second.py

Se supponiamo che il nostro repository ha una certa history e che abbiamo alcune modifiche in corso, sia nella working directory che nella staging area, e che non siamo in uno stato “detached”, indicando solo la modalità avremmo come risultato che:

  • soft -> praticamente invariato
  • mixed -> pulisce la staging area
  • hard -> rimuove tutte le modifiche e torna allineato con HEAD

Se però indicassimo come reference a cui fare reset uno dei commit:

$ git reset --hard cc7f96f
HEAD is now at cc7f96f improve performance on first feature
$ git log --oneline
cc7f96f (HEAD -> master) improve performance on first feature
1e1bf33 add first feature
f6a76e4 initialize project
$ git status --short
?? second.py

In questo caso, sono stati rimossi dalla history locale del branch tutti i commit successivi a quello indicato nel comando git reset. Il file second.py è tornato ad essere untracked, poiché non esisteva in quella versione del progetto. In pratica, siamo passati da questa situazione:

[a]<--[b]<--[c]<--[d]<--[e]::{main}
                            |
                            HEAD

a una situazione in cui i commit successivi a quello a cui si è fatto il reset non fanno più parte del branch:

                   [d]<--[e]

[a]<--[b]<--[c]::{main}
                |
                HEAD

A cosa può essere utile il comando git reset in Git?
In generale, è utile ad annullare modifiche locali che non sono mai state pubblicate su una origin condivisa. Rimuovere un commit da un repository su cui altri web developers possono aver continuato a sviluppare crea seri problemi alla collaborazione. I casi d’uso possibile possono, quindi, essere i seguenti:

  • git reset --hard: rimuove ogni propria modifica e riporta la working directory in sync con l’ultimo commit
  • git reset: “pulisce” la staging area, mantenendo ogni differenza con l’ultimo commit nella working directory
  • git reset <FILE>: come sopra, ma solo per uno specifico file e non per tutte le modifiche
  • git reset --hard <COMMIT>: nel caso in cui ci accorgessimo che a partire da un certo commit in poi, e solo nel caso in cui tali commit sono rimasti sul proprio clone locale, il lavoro è completamente da scartare senza remore, riporta il progetto a tale commit “buono”, buttando via il resto
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