Forum: Italian Ruby user group 'git reset' ovvero 'come eliminare un commit'

Posted by Cluter Vipic (cluter)
on 2012-07-10 02:08
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://stackoverflow.com/questions/179123/how-do-i...

-
http://stackoverflow.com/questions/495345/git-remo...

-
http://www.importahmedeid.com/2012/02/01/how-to-re...

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 Vipic <la_mai_email@gmail.com>
Date:   Sat Jul 7 13:06:58 2012 -0700

quarto commit

commit xe5bc9dc8c184f6f85159959564a1f112e32578
Author: Cluter Vipic <la_mai_email@gmail.com>
Date:   Sat Jul 7 13:05:58 2012 -0700

terzo commit

commit 45b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter Vipic <la_mai_email@gmail.com>
Date:   Sat Jul 7 13:04:58 2012 -0700

secondo commit

commit 12b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter Vipic <la_mai_email@gmail.com>
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 Vipic <la_mai_email@gmail.com>
Date:   Sat Jul 7 13:05:58 2012 -0700

terzo commit

commit 45b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter Vipic <la_mai_email@gmail.com>
Date:   Sat Jul 7 13:04:58 2012 -0700

secondo commit

commit 12b0e7762132ebaabfa6226eb1a72556ef91cbe0
Author: Cluter Vipic <la_mai_email@gmail.com>
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
Posted by Michele Franzin (Guest)
on 2012-07-10 07:50
(Received via mailing list)
C'è una soluzione più veloce (ed IMHO più semplice) che è facendo un 
rebase
interattivo.
Posted by Fabrizio Regini (Guest)
on 2012-07-10 09:24
(Received via mailing list)
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
Posted by Simone D'Amico (Guest)
on 2012-07-10 09:42
Attachment: signature.asc (202 Bytes)
(Received via mailing list)
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
sim@me.com
Posted by Michele Franzin (Guest)
on 2012-07-10 11:40
(Received via mailing list)
2012/7/10 Simone D'Amico <sim@me.com>:
> 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.
Posted by Cluter Vipic (cluter)
on 2012-07-11 22:15
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 Regini"

> 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 Franzin wrote in post #1068092:
> 2012/7/10 Simone D'Amico <sim@me.com>:
>> 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.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.