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.
-
git checkout b3d92c5
Tjek den sidste anvendelige forpligtelse. -
git checkout -b repair
Opret en ny gren at arbejde på. -
git cherry-pick 77b9b82
Kør igennem commit 3. -
git cherry-pick 2c6a45b
Kør igennem commit 1. -
git checkout master
Checkout-master. -
git reset --hard b3d92c5
Nulstil master til sidste brugbare forpligtelse. -
git merge repair
Flet vores nye gren til master. -
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!