Eliminare un commit git

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.

  1. git checkout b3d92c5 Controlla lultimo commit utilizzabile.
  2. git checkout -b repair Crea un nuovo ramo su cui lavorare.
  3. git cherry-pick 77b9b82 Esegui il commit 3.
  4. git cherry-pick 2c6a45b Esegui il commit 1.
  5. git checkout master Checkout master.
  6. git reset --hard b3d92c5 Reimposta il master allultimo commit utilizzabile.
  7. git merge repair Unisci il nostro nuovo ramo al master.
  8. 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!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *