Sletning af en git-forpligtelse

Når du arbejder med Git, vil du opdage, at forpligtelser undertiden skal fjernes, da de har introduceret en fejl eller skal bearbejdes.

Hvis det er den sidste forpligtelse er meget ligetil. Kør blot:

git reset HEAD^

Dette vil poppe ud af den seneste forpligtelse, men lade alle dine ændringer i filerne være intakte.

Hvis du har brug for at slette mere end bare den sidste forpligtelse, er der to metoder, du kan bruge. Den første bruger rebase, dette giver dig mulighed for at fjerne en eller flere på hinanden følgende forpligtelser, den anden er cherry-pick, som giver dig mulighed for at fjerne ikke-på hinanden følgende forpligtelser.

Eksempel på git-log

Nummer Hash Foretag meddelelse Forfatter
1 2c6a45b (HEAD) Tilføjelse af offentlig metode for at få adgang til beskyttet metode Tom
2 ae45fab Opdateringer til database interface Entreprenør 1
3 77b9b82 Forbedring af databaseinterface Entreprenør 2
4 3c9093c Flettet udvikler gren til master Tom
5 b3d92c5 Tilføjelse af nyt Event CMS-modul Paul
6 7feddbb Tilføjelse af CMS-klasse og filer Tom
7 a809379 Tilføjelse af projekt til Git Tom

Brug af Rebase

Brug af git-loggen ovenfor vil vi fjerne følgende forpligtelser; 2 & 3 (ae45fab & 77b9b82). Da de er fortløbende forpligtelser, kan vi bruge rebase.

git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>

f.eks. For at fjerne forpligtelser 2 & 3 ovenfor

git rebase --onto repair~3 repair~1 repair

Brug af Cherry Pick

Trin 1: Find forpligtelsen inden forpligtelsen du vil fjerne git log

Trin 2: Checkout, der begår git checkout <commit hash>

Trin 3 : Opret en ny gren ved hjælp af din nuværende checkout-forpligtelse git checkout -b <new branch>

Trin 4: Nu skal du tilføje en forpligtelse, når den fjernede forpligtelse git cherry-pick <commit hash>

Trin 5: Gentag nu trin 4 for alle andre forpligtelser, du vil beholde.

Trin 6: Når alle forpligtelser er blevet føjet til din nye filial og er blevet begået. Kontroller, at alt er i den korrekte tilstand og fungerer efter hensigten. Dobbeltkontrol alt er begået: git status

Trin 7: Skift til din ødelagte gren git checkout <broken branch>

Trin 8: Udfør nu en hård nulstilling af den ødelagte gren til den forpligtelse inden den, du vil fjerne git reset --hard <commit hash>

Trin 9: Flet din fast gren i denne gren git merge <branch name>

Trin 10: Skub de flettede ændringer tilbage til oprindelsen. ADVARSEL: Dette overskriver fjernbetjeningen! git push --force origin <branch name>

Du kan udføre processen uden at oprette en ny gren ved at erstatte trin 2 & 3 med trin 8 og derefter udfør ikke trin 7 & 9.

Eksempel

Sig, at vi vil fjerne forpligtelser 2 & 4 fra repoen.

  1. git checkout b3d92c5 Tjek den sidste anvendelige forpligtelse.
  2. git checkout -b repair Opret en ny gren at arbejde på.
  3. git cherry-pick 77b9b82 Kør igennem commit 3.
  4. git cherry-pick 2c6a45b Kør igennem commit 1.
  5. git checkout master Checkout-master.
  6. git reset --hard b3d92c5 Nulstil master til sidste brugbare forpligtelse.
  7. git merge repair Flet vores nye gren til master.
  8. git push --hard origin master Skub master til den eksterne repo.

Afsluttende note

Git rebase & cherrypick er farligt, men stærkt løsninger, der kun skal bruges som en sidste mulighed og kun foretages af nogen, der ved, hvad de laver. Vær opmærksom på, at begge løsninger kan have negative virkninger på andre brugere, der arbejder på det samme arkiv / gren.

Endelig husk at være forsigtig og held og lykke!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *