Den ultimative guide til git-nulstilling og git-gendannelse

Velkommen til vores ultimative guide til den git resetog git revertkommandoer. Denne vejledning lærer dig alt hvad du behøver at vide om at rette almindelige fejl og fortryde dårlige forpligtelser, mens du bruger Git.

Forstå de tre sektioner af et Git-projekt

Et Git-projekt har følgende tre hovedafsnit:

  1. Git-bibliotek
  2. Arbejdsmappe (eller arbejdstræ)
  3. Iscenesættelsesområde

Den Git Vejviser (placeret i YOUR-PROJECT-PATH/.git/) er, hvor Git gemmer alt det skal præcist at spore projektet. Dette inkluderer metadata og en objektdatabase, der inkluderer komprimerede versioner af projektfilerne.

Den arbejdsmappe er, hvor en bruger foretager lokale ændringer i et projekt. Arbejdsmappen trækker projektets filer fra Git-katalogets objektdatabase og placerer dem på brugerens lokale maskine.

Bemærk: Katalog er også kendt som repository eller kort form repo. Repo på brugerens lokale maskine kaldes "Local repo", mens repo på git-server kaldes "Remote repo".

Den iscenesættelse Området er en fil (også kaldet "indeks", "scene", eller "cache"), som lagrer oplysninger om, hvad der vil gå ind i din næste begå. En forpligtelse er, når du beder Git om at gemme disse iscenesatte ændringer. Git tager et øjebliksbillede af filerne, som de er, og gemmer det øjebliksbillede permanent i Git-biblioteket.

Med tre sektioner er der tre hovedtilstande, som en fil kan være i til enhver tid: modificeret, begået eller iscenesat. Du ændrer en fil, hver gang du foretager ændringer i den i din arbejdsmappe. Dernæst er det iscenesat, når du flytter det til iscenesættelsesområdet. Endelig er det begået efter en forpligtelse.

Git Reset

Den git resetkommandoen tillader dig at nulstille din nuværende leder til en specificeret tilstand. Du kan nulstille tilstanden for bestemte filer såvel som en hel filial. Dette er nyttigt, hvis du endnu ikke har skubbet din forpligtelse til GitHub eller et andet eksternt lager.

Nulstil en fil eller et sæt filer

Den følgende kommando giver dig mulighed for selektivt at vælge stykker af indhold og vende tilbage eller fjerne scenen.

git reset (--patch | -p) [tree-ish] [--] [paths]

Fjern scenen for en fil

Hvis du flyttede en fil ind i mellemstationer med git add, men ikke længere vil have den til at være en del af en forpligtelse, kan du bruge git resettil at fjerne scenen for den fil:

git reset HEAD FILE-TO-UNSTAGE

De ændringer, du har foretaget, vil stadig være i filen, denne kommando fjerner bare den fil fra dit mellemstationer.

Nulstil en filial til en forudgående forpligtelse

Den følgende kommando nulstiller din nuværende gren HEAD til den givne COMMITog opdaterer indekset. Det spoler dybest set tilbage på din gren, så skriv alle forpligtelser, du foretager fremad, over alt, der kom efter nulstillingspunktet. Hvis du udelader den MODE, er den som standard --mixed:

git reset MODE COMMIT

Mulighederne for MODEer:

  • --soft: nulstiller ikke indeksfilen eller arbejdstræet, men nulstiller HEAD til commit. Ændrer alle filer til "Ændringer, der skal begås"
  • --mixed: nulstiller indekset, men ikke arbejdstræet og rapporterer, hvad der ikke er opdateret
  • --hard: nulstiller indekset og det arbejdende træ. Eventuelle ændringer i sporede filer i arbejdstræet siden commitkasseres
  • --merge: nulstiller indekset og opdaterer filerne i arbejdstræet, der er forskellige mellem commitog HEAD, men holder dem, der er forskellige mellem indekset og arbejdstræet
  • --keep: nulstiller indeksindgange og opdaterer filer i arbejdstræet, der er forskellige mellem commitog HEAD. Hvis en fil, der er forskellig mellem commitog HEAD, har lokale ændringer, afbrydes nulstillingen

Vigtig note om hårde nulstillinger

Vær meget forsigtig, når du bruger --hardindstillingen med, git resetda den nulstiller dit forpligtelses-, iscenesættelsesområde og din arbejdsmappe. Hvis denne indstilling ikke bruges korrekt, kan man ende med at miste den kode, der er skrevet.

Git Revert

Både kommandoer git revertog git resetkommandoer fortryder tidligere forpligtelser. Men hvis du allerede har skubbet din forpligtelse til et eksternt lager, anbefales det, at du ikke bruger det, git resetda det omskriver historien om forpligtelser. Dette kan gøre det svært at arbejde på et arkiv med andre udviklere og opretholde en konsistent historie om forpligtelser.

I stedet er det bedre at bruge git revert, hvilket fortryder de ændringer, der blev foretaget af en tidligere forpligtelse ved at oprette en helt ny forpligtelse, alt sammen uden at ændre historien om forpligtelser.

Gendan en forpligtelse eller et sæt forpligtelser

Den følgende kommando giver dig mulighed for at tilbagekalde ændringer fra en tidligere forpligtelse eller begå og oprette en ny forpligtelse.

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort

Almindelige muligheder:

 -e --edit
  • Dette er standardindstillingen og behøver ikke at angives eksplicit. Det åbner dit systems standardteksteditor og lader dig redigere den nye meddelelsesmeddelelse, inden du begår tilbagevenden.
  • Denne indstilling gør det modsatte af -eog git revertåbner ikke teksteditoren.
  • Denne mulighed forhindrer git revertfortrydelse af en tidligere forpligtelse og oprettelse af en ny. I stedet for at oprette en ny forpligtelse -nfortryder du ændringerne fra den foregående forpligtelse og føjer dem til Staging Index og Working Directory.
 --no-edit
-n -no-commit

Eksempel.

Lad os forestille os følgende situation: 1.) Du arbejder på en fil, og du tilføjer og foretager dine ændringer. 2.) Du arbejder derefter på et par andre ting og laver nogle flere forpligtelser. 3.) Nu er du klar over, at du for tre eller fire forpligtelser siden gjorde noget, du gerne vil fortryde - hvordan kan du gøre dette?

Du tænker måske, brug bare git reset, men dette fjerner alle forpligtelser efter den, du gerne vil ændre - git reverttil undsætning! Lad os gennemgå dette eksempel:

mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`

Og med det er du et skridt tættere på at få dit sorte bælte i Git.