Radera ett git-engagemang

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.

  1. git checkout b3d92c5 Kassa det senaste användbara åtagandet.
  2. git checkout -b repair Skapa en ny gren att arbeta med.
  3. git cherry-pick 77b9b82 Kör igenom engagemang 3.
  4. git cherry-pick 2c6a45b Kör igenom engagemang 1.
  5. git checkout master Kassamästare.
  6. git reset --hard b3d92c5 Återställ master till senaste användbara engagemang.
  7. git merge repair Slå ihop vår nya gren till master.
  8. 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!

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *