Slette en git-forpliktelse

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.

  1. git checkout b3d92c5 Kassa den siste brukbare forpliktelsen.
  2. git checkout -b repair Opprett en ny gren å jobbe med.
  3. git cherry-pick 77b9b82 Kjør gjennom commit 3.
  4. git cherry-pick 2c6a45b Kjør gjennom forpliktelse 1.
  5. git checkout master Checkout master.
  6. git reset --hard b3d92c5 Tilbakestill master til siste brukbare kommisjon.
  7. git merge repair Slå sammen vår nye gren til master.
  8. 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!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *