När du arbetar med Git kommer du att upptäcka att det ibland måste tas bort åtaganden eftersom de har infört ett fel eller behöver omarbetas.
Om det är det senaste åtagandet är mycket rakt framåt. Kör helt enkelt:
git reset HEAD^
Detta kommer att visa det senaste engagemanget men lämna alla dina ändringar i filerna intakta.
Om du behöver ta bort mer än bara det senaste åtagandet finns det två metoder du kan använda. Den första använder rebase så att du kan ta bort en eller flera på varandra följande åtaganden den andra är körsbärsplockning som gör att du kan ta bort icke-på varandra följande åtaganden.
Exempel på git-logg
Nummer | Hash | Åtagande meddelande | Författare |
---|---|---|---|
1 | 2c6a45b | (HEAD) Lägg till offentlig metod för att komma åt skyddad metod | Tom |
2 | ae45fab | Uppdateringar till databasgränssnitt | Entreprenör 1 |
3 | 77b9b82 | Förbättrar databasgränssnittet | Entreprenör 2 |
4 | 3c9093c | Sammanlagd utveckla gren till master | Tom |
5 | b3d92c5 | Lägga till ny CMS-modul för händelse | Paul |
6 | 7feddbb | Lägga till CMS-klass och filer | Tom |
7 | a809379 | Lägger till projekt i Git | Tom |
Använda Rebase
Med hjälp av git-loggen ovan vill vi ta bort följande åtaganden; 2 & 3 (ae45fab & 77b9b82). Eftersom de är på varandra följande åtaganden kan vi använda rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
t.ex. för att ta bort åtaganden 2 & 3 ovan
git rebase --onto repair~3 repair~1 repair
Använd Cherry Pick
Steg 1: Hitta engagemanget före engagemanget du vill ta bort git log
Steg 2: Kassa som gör git checkout <commit hash>
Steg 3 : Skapa en ny filial med din nuvarande kassaåtagande git checkout -b <new branch>
Steg 4: Nu måste du lägga till engagemanget efter det borttagna engagemanget git cherry-pick <commit hash>
Steg 5: Upprepa nu steg 4 för alla andra åtaganden du vill behålla.
Steg 6: När alla åtaganden har lagts till i din nya filial och har har begåtts. Kontrollera att allt är i rätt skick och fungerar som avsett. Dubbelkolla allt har begåtts: git status
Steg 7: Byt till din trasiga gren git checkout <broken branch>
Steg 8: Utför nu en hård återställning av den trasiga grenen till engagemanget före den du vill ta bort git reset --hard <commit hash>
Steg 9: Sammanfoga din fixad gren i den här grenen git merge <branch name>
Steg 10: Tryck tillbaka de sammanslagna ändringarna till ursprunget. VARNING: Detta kommer att skriva över fjärrkontrollen! git push --force origin <branch name>
Du kan göra processen utan att skapa en ny gren genom att ersätta steg 2 & 3 med steg 8 och sedan utför inte steg 7 & 9.
Exempel
Säg att vi vill ta bort åtaganden 2 & 4 från repo.
-
git checkout b3d92c5
Kassa det senaste användbara åtagandet. -
git checkout -b repair
Skapa en ny gren att arbeta med. -
git cherry-pick 77b9b82
Kör igenom engagemang 3. -
git cherry-pick 2c6a45b
Kör igenom engagemang 1. -
git checkout master
Kassamästare. -
git reset --hard b3d92c5
Återställ master till senaste användbara engagemang. -
git merge repair
Slå ihop vår nya gren till master. -
git push --hard origin master
Tryck master till fjärrkontrollen.
Slutanmärkning
Git rebase & cherrypick är farliga men kraftfulla lösningar som endast ska användas som en sista alternativet och endast utföras av någon som vet vad de gör. Var uppmärksam på att båda lösningarna kan ha negativa effekter på andra användare som arbetar med samma arkiv / gren.
Slutligen kom ihåg att vara försiktig och lycka till!