Quando lavori con Git, scoprirai che a volte i commit devono essere rimossi poiché hanno introdotto un bug o devono essere rielaborati.
Se lo è lultimo commit questo è molto semplice. Esegui semplicemente:
git reset HEAD^
Questo farà uscire lultimo commit ma lascerà intatte tutte le tue modifiche ai file.
Se è necessario eliminare più dellultimo commit, ci sono due metodi che è possibile utilizzare. Il primo è lutilizzo del rebase che ti permetterà di rimuovere uno o più commit consecutivi, laltro è cherry-pick che ti permette di rimuovere commit non consecutivi.
Esempio git log
Numero | Hash | Conferma messaggio | Autore |
---|---|---|---|
1 | 2c6a45b | (HEAD) Aggiunta di metodo pubblico per accedere al metodo protetto | Tom |
2 | ae45fab | Aggiornamenti allinterfaccia del database | Appaltatore 1 |
3 | 77b9b82 | Miglioramento dellinterfaccia del database | Appaltatore 2 |
4 | 3c9093c | Ramo sviluppo unito nel master | Tom |
5 | b3d92c5 | Aggiunta di un nuovo modulo CMS per eventi | Paul |
6 | 7feddbb | Aggiunta di file e classi CMS | Tom |
7 | a809379 | Aggiunta di progetto a Git | Tom |
Uso di Rebase
Usando il log git sopra vogliamo rimuovere i seguenti commit; 2 & 3 (ae45fab & 77b9b82). Poiché sono commit consecutivi, possiamo usare rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
ad es. Per rimuovere i commit 2 & 3 sopra
git rebase --onto repair~3 repair~1 repair
Utilizzo di Cherry Pick
Passaggio 1: trova il commit prima del commit desideri rimuovere git log
Passaggio 2: verifica il commit git checkout <commit hash>
Passaggio 3 : Crea un nuovo branch utilizzando il commit di checkout corrente git checkout -b <new branch>
Passaggio 4: ora devi aggiungere il commit dopo il commit rimosso git cherry-pick <commit hash>
Passaggio 5: ora ripeti il passaggio 4 per tutti gli altri commit che desideri mantenere.
Passaggio 6: una volta che tutti i commit sono stati aggiunti al tuo nuovo branch e stato impegnato. Verificare che tutto sia nello stato corretto e funzioni come previsto. Controlla che sia stato eseguito il commit di tutto: git status
Passaggio 7: passa al ramo interrotto git checkout <broken branch>
Passaggio 8: ora esegui un hard reset sul ramo danneggiato del commit prima di quello che desideri rimuovere git reset --hard <commit hash>
Passaggio 9: unisci corretto ramo in questo ramo git merge <branch name>
Passaggio 10: reimposta le modifiche unite allorigine. ATTENZIONE: questo sovrascriverà il repository remoto! git push --force origin <branch name>
Puoi eseguire il processo senza creare un nuovo ramo sostituendo il Passaggio 2 & 3 con il Passaggio 8, quindi non eseguire il passaggio 7 & 9.
Esempio
Supponiamo di voler rimuovere i commit 2 & 4 dal repository.
-
git checkout b3d92c5
Controlla lultimo commit utilizzabile. -
git checkout -b repair
Crea un nuovo ramo su cui lavorare. -
git cherry-pick 77b9b82
Esegui il commit 3. -
git cherry-pick 2c6a45b
Esegui il commit 1. -
git checkout master
Checkout master. -
git reset --hard b3d92c5
Reimposta il master allultimo commit utilizzabile. -
git merge repair
Unisci il nostro nuovo ramo al master. -
git push --hard origin master
Invia master al repository remoto.
Nota finale
Git rebase & cherrypick sono pericolosi ma potenti soluzioni che dovrebbero essere usate solo come ultima opzione ed essere intrapresa solo da qualcuno che sa cosa sta facendo. Fai attenzione che entrambe le soluzioni potrebbero avere effetti negativi su altri utenti che stanno lavorando sullo stesso repository / ramo.
Infine ricorda di fare attenzione e buona fortuna!