'git reset' ovvero 'come eliminare un commit'

Salve a tutto il forum,

Ogni tanto vi frequento qui per capire meglio un po’ sulla tecnologia
Git, jQuery, HTML5/CSS e Rails (cose del tutto sconosciute per persone
che hanno fatto studi con indirizzo NON informatico come me)

Questo post vuole soltanto mettere in luce la difficoltà’ di trovare le
informazioni relativamente a certi semplici problemi (come quelli che io
ho al momento e che pero’ se non riesci a soluzionarli difficile e’
poter continuare)

**** AVEVO UN PROBLEMA ****

A volte la sovrabbondanza di informazioni può’ causare confusione,
scoramento, stenti e alla fine molta sfiducia in se stessi (tranquilli
non spero che siate voi a farmela ritornare)

Allora il mio problema era molto semplice io dopo la mia creazione della
APP in Rails facevo il mio primo commit

$ git init

perfetto! comincio a lavorare e lancio diversi commit dopo ovviamente
modifiche del codice

$ git add .

$ git commit -m “primo commit”
$ git commit -m “secondo commit”
$ git commit -m “terzo commit”
$ git commit -m “quarto commit”

usando sempre lo stesso branch ovvero il branch *master (so
dell’esistenza del comando “git branch nuovo_branch” ma quando sei
all’inizio della scrittura di una app questo tipo di comando lo
considero eccessivo) e mi accorgo pero’ arrivato a un certo punto che ho
commesso una “corbelleria” con il “quarto commit” quindi tutte le
modifiche fatte con il “quarto commit” le vorrei completamente eliminare
e ritornare alla versione del repository “terzo commit”

Facendo una ricerca con il solito Google mi sono imbattuto sui seguenti
link (le parole chiavi inserite erano del tipo: “delete a commit git”,
“return your previous commit” che ho ottenuto smussando le vecchie
precedenti parole chiave in quanto all’inizio ero proprio fuori strada):

http://www.importahmedeid.com/2012/02/01/how-to-revert-to-a-previous-commit-made-in-xcode-using-git/

ma devo dirvi che stavo cercando una soluzione del tipo “quando
vuoi eliminare un commit e ritornare al precedente devi usare il
seguente comando” (il terzo link fra quelli suindicati era il più’
chiaro sulla soluzione anche se faceva riferimento a XCode una
piattaforma che non uso e non capivo perché’ Google me lo stava
mostrando). Sara’ anche dovuto al fatto che la maggior parte delle
informazioni su questo argomento e’ in inglese? Che dire siamo nati nel
posto sbagliato?

**** ALLA FINE HO TROVATO LA SOLUZIONE ****

dopo aver letto svariate cose ho utilizzato la seguente soluzione

  1. fare un bel $ git log

commit ce5bc9dc8c184f6f85159959564a1f112e32578
Author: Cluter V. [email protected]
Date: Sat Jul 7 13:06:58 2012 -0700

quarto commit

commit xe5bc9dc8c184f6f85159959564a1f112e32578
Author: Cluter V. [email protected]
Date: Sat Jul 7 13:05:58 2012 -0700

terzo commit

commit 45b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter V. [email protected]
Date: Sat Jul 7 13:04:58 2012 -0700

secondo commit

commit 12b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter V. [email protected]
Date: Sat Jul 7 13:03:58 2012 -0700

primo commit

**** GIT RESET ****

quindi in questo caso il comando da usare per eliminare il ‘quarto
commit’ e’ il seguente

“git reset –hard ce5bc9dc8c184f6f85159959564a1f112e32578″

quindi successivamente se lanceremo di nuovo il comando $ git log ,
avremo:

commit xe5bc9dc8c184f6f85159959564a1f112e32578
Author: Cluter V. [email protected]
Date: Sat Jul 7 13:05:58 2012 -0700

terzo commit

commit 45b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter V. [email protected]
Date: Sat Jul 7 13:04:58 2012 -0700

secondo commit

commit 12b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter V. [email protected]
Date: Sat Jul 7 13:03:58 2012 -0700

primo commit

trovare una soluzione del genere non e’ stato facile ho impiegato più’
di 1 ora che per il tipo di problema mi sembra eccessivo ad ogni modo
grazie per l’attenzione e scusate lo sfogo

a presto,

C

C’è una soluzione più veloce (ed IMHO più semplice) che è facendo un
rebase
interattivo.

Quello che hai fatto alla fine è corretto ma capisco lo stress e la
paura di perdere il lavoro fatto.
Se il commit che devi eliminare è l’ultimo, come nel tuo caso, la
soluzione è facile come quella che hai trovato.

Come suggerito da Michele, un rebase interattivo ti da più possibilità,
nel tuo caso:

git rebase -i HEAD~4

che vuol dire “riapplica gli ultimi quattro commit e chiedimi cosa fare
con ciascuno”. Ti apre un editor dove puoi rivedere i commit ed
eventualmente “eliminarne” alcuni, non necessariamente l’ultimo o gli
ultimi. Considera però che se cancelli un commit, e il successivo si
basa su di esso, dovrai risolvere un conflitto a mano.

Riguardo la paura di perdere il lavoro, un paio di suggerimenti:

  1. in git, branch e tag sono come dei pezzi di scotch che metti sul capo
    di un filo. Fino a quando c’è un’etichetta del genere non lo puoi
    perdere. Pertanto nel tuo caso, prima di fare il reset potevi fare un
    ‘git branch copy_of_master’ che ti avrebbe creato un branch copia di
    master a quel dato momento.

  2. c’è sempre git reflog che è un registro di tutto quello che fai in
    git. Fino a quando non gira un git gc (garbage collect) trovi tutto,
    puoi anche recuperare degli headless commit.

-f

Mi permetto di segnalare anche
http://marklodato.github.com/visual-git-guide/index-en.html per chi come
me fa spesso confusione tra i comandi.

Simone D’Amico
COO @ Metwit.com
Follow us: @HowdyClowdy
bit.ly/scheduleameeting
[email protected]

Salve a tutti,

grazie per le risposte e dopo aver letto un po’ di cose mi sono accorto
che non avevo compreso il comando ‘git reset’ che non capisco perché’ in
conclusione non mi elimina il git cosa che invece di aiuta a gestire
meglio il comando indicato da “Fabrizio R.”

git rebase -i HEAD~4

e adesso uso questo perché quello che volevo era proprio la cosa
seguente:

cancella il commit e ritornare alla situazione della app alla situazione
dell’ultimo commit fatto

ciao e grazie,

C

Michele F. wrote in post #1068092:

2012/7/10 Simone D’Amico [email protected]:

Mi permetto di segnalare anche
http://marklodato.github.com/visual-git-guide/index-en.html per chi come
me fa
spesso confusione tra i comandi.

non la conoscevo, ottimo link!

m.

2012/7/10 Simone D’Amico [email protected]:

Mi permetto di segnalare anche
http://marklodato.github.com/visual-git-guide/index-en.html per chi come me fa
spesso confusione tra i comandi.

non la conoscevo, ottimo link!

m.