Når du arbeider med Git, vil du oppdage at noen ganger forpliktelser må fjernes ettersom de har introdusert en feil eller må bearbeides.
Hvis det er den siste begå dette er veldig rett frem. Bare kjør:
git reset HEAD^
Dette vil vise den siste forpliktelsen, men la alle endringene i filene være intakte.
Hvis du trenger å slette mer enn bare den siste forpliktelsen, er det to metoder du kan bruke. Den første bruker rebase, slik at du kan fjerne en eller flere påfølgende forpliktelser, den andre er cherry-pick, som lar deg fjerne ikke påfølgende forpliktelser.
Eksempel på git-logg
Antall | Hash | Forpliktende melding | Forfatter |
---|---|---|---|
1 | 2c6a45b | (HEAD) Legger til offentlig metode for å få tilgang til beskyttet metode | Tom |
2 | ae45fab | Oppdateringer til databasegrensesnitt | Entreprenør 1 |
3 | 77b9b82 | Forbedring av databasegrensesnitt | Entreprenør 2 |
4 | 3c9093c | Fusjonert utvikle gren til master | Tom |
5 | b3d92c5 | Legger til ny CMS-modul for hendelse | Paul |
6 | 7feddbb | Legger til CMS-klasse og filer | Tom |
7 | a809379 | Legger til prosjekt i Git | Tom |
Bruke Rebase
Ved å bruke git-loggen ovenfor vil vi fjerne følgende forpliktelser; 2 & 3 (ae45fab & 77b9b82). Siden de er påfølgende forpliktelser, kan vi bruke rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
f.eks. For å fjerne forpliktelser 2 & 3 over
git rebase --onto repair~3 repair~1 repair
Bruk av Cherry Pick
Trinn 1: Finn commitet før commit du vil fjerne git log
Trinn 2: Kasse som forplikter git checkout <commit hash>
Trinn 3 : Lag en ny gren ved å bruke den nåværende kassa-forpliktelsen git checkout -b <new branch>
Trinn 4: Nå må du legge til forpliktelsen etter den fjernede forpliktelsen git cherry-pick <commit hash>
Trinn 5: Gjenta nå trinn 4 for alle andre forpliktelser du vil beholde.
Trinn 6: Når alle forpliktelser er lagt til i din nye gren og har blitt begått. Kontroller at alt er i riktig tilstand og fungerer etter hensikten. Dobbeltsjekk alt er begått: git status
Trinn 7: Bytt til den ødelagte grenen git checkout <broken branch>
Trinn 8: Utfør nå en hard tilbakestilling av den ødelagte grenen til forpliktelsen før den du vil fjerne git reset --hard <commit hash>
Trinn 9: Slå sammen fast gren i denne grenen git merge <branch name>
Trinn 10: Skyv de sammenslåtte endringene tilbake til opprinnelsen. ADVARSEL: Dette vil overskrive den eksterne repoen! git push --force origin <branch name>
Du kan gjøre prosessen uten å opprette en ny gren ved å erstatte trinn 2 & 3 med trinn 8 og deretter ikke utfør trinn 7 & 9.
Eksempel
Si at vi vil fjerne forpliktelser 2 & 4 fra repoen.
-
git checkout b3d92c5
Kassa den siste brukbare forpliktelsen. -
git checkout -b repair
Opprett en ny gren å jobbe med. -
git cherry-pick 77b9b82
Kjør gjennom commit 3. -
git cherry-pick 2c6a45b
Kjør gjennom forpliktelse 1. -
git checkout master
Checkout master. -
git reset --hard b3d92c5
Tilbakestill master til siste brukbare kommisjon. -
git merge repair
Slå sammen vår nye gren til master. -
git push --hard origin master
Skyv master til ekstern repo.
Avsluttende merknad
Git rebase & cherrypick er farlig, men kraftig løsninger som bare skal brukes som en siste alternativet og bare utføres av noen som vet hva de gjør. Vær oppmerksom på at begge løsningene kan ha negative effekter på andre brukere som jobber med samme arkiv / gren.
Endelig husk å være forsiktig og lykke til!