Git Succinctly Tilbakestill endringer

Hele poenget med å opprettholde "trygge" kopier av et programvareprosjekt er ro i sinnet: Hvis prosjektet plutselig går i stykker, vet du at du har lett tilgang til en funksjonell versjon, og du vil kunne finne ut nøyaktig hvor problemet Ble introdusert. Til dette formål er opptaksforbindelser ubrukelig uten muligheten til å angre endringer. Men siden Git har så mange komponenter, kan "å angripe" ta på seg mange forskjellige betydninger. For eksempel kan du:

  • Løsne endringer i arbeidskatalogen
  • Fortryd endringer i oppstartingsområdet
  • Angre en hel forpliktelse

For å komplisere ting enda lenger, er det flere måter å angre en forpliktelse på. Du kan enten:

  1. Bare slett commit fra prosjekthistorikken.
  2. Forlate forpliktelsen som det er, ved å bruke et nytt forpliktelse for å angre endringene som ble introdusert ved første forpliktelse.

Git har et dedikert verktøy for hver av disse situasjonene. La oss starte med arbeidskatalogen.


Å angre i arbeidskatalogen

Tidsperioden umiddelbart etter å ha lagret en sikker kopi av et prosjekt er en av stor nyskapning. Styrket av kunnskapen om at du er fri til å gjøre hva som helst du vil uten å skade kodebase, kan du eksperimentere med ditt hjertes innhold. Men denne ubekymrede eksperimenteringen tar ofte en feil sving og fører til en arbeidskatalog med en bunke av off topic kode. Når du kommer til dette punktet, vil du sannsynligvis kjøre følgende kommandoer:

 git reset - hard HEAD git clean -f

Denne konfigurasjonen av git reset gjør arbeidskatalogen og scenen samsvarer med filene i den nyeste forpliktelsen (også kalt HODE), og eliminerer effektivt alle uforpliktende endringer i spores filer. Å kvitte seg med untracked filer, du må bruke git ren kommando. Git er veldig forsiktig med å fjerne kode, så du må også levere -f mulighet til å tvinge slettingen av disse filene.


Tilbakestiller alle ubegrensede endringer

Individuelle filer

Det er også mulig å målrette individuelle filer. Følgende kommando vil gjøre en enkelt fil i arbeidskatalogen tilsvarer versjonen i den nyeste kommandoen.

 git kassa HEAD 

Denne kommandoen endrer ikke prosjekthistorikken i det hele tatt, så du kan trygt erstatte HODE med en commit ID, gren eller tag for å gjøre filen samsvarer med versjonen i det forpliktelsen. Men gjør det ikke prøv dette med git reset, som det vil endre historien din (forklart i Tilbakestille forpliktelser).


Tilbakestille en fil med git kassen

Å angre på Staging-området

I ferd med å konfigurere ditt neste forpliktelse, vil du av og til legge til en ekstra fil til scenen. Følgende påkalling av git reset vil unstage det:

 Git reset HEAD 

Utelatelse av --hard flagg forteller Git å forlate arbeidskatalogen alene (i motsetning til git reset - hard head, som tilbakestiller hver fil i både arbeidskatalogen og scenen). Den iscenesatte versjonen av filen samsvarer HODE, og arbeidskatalogen beholder den modifiserte versjonen. Som du kanskje forventer, resulterer dette i en uendret modifikasjon i din git status produksjon.


Unstaging en fil med git reset

Tilbakestille forpliktelser

Det er to måter å angre en forpliktelse ved hjelp av Git: Du kan heller tilbakestille det ved å bare fjerne det fra prosjekthistorikken, eller du kan tilbake det ved å generere en ny forplikte seg til å kvitte seg med endringene som ble introdusert i originalen. Å angre ved å introdusere en annen forpliktelse kan virke overdreven, men omskrivning av historikk ved å helt fjerne forpliktelser kan ha alvorlige konsekvenser i flerbrukerens arbeidsflyter.

Nullstilling

Den allsidige git reset kan også brukes til bevege seg de HODE henvisning.

 Git reset HEAD ~ 1

De HEAD ~ 1 syntaxparameter spesifiserer forpliktelsen som skjer umiddelbart før HODE (like måte, HEAD ~ 2 refererer til den andre forpliktelsen før HODE). Ved å flytte HODE referanse bakover, fjerner du effektivt den nyeste forpliktelsen fra prosjektets historie.


flytting HODE til HEAD ~ 1 med git reset

Dette er en enkel måte å fjerne et par begjæringer som kjører off-topic, men det representerer et seriøst samarbeidsproblem. Hvis andre utviklere hadde begynt å bygge på toppen av forpliktelsen vi fjernet, hvordan ville de synkronisere med vårt lager? De vil måtte spørre oss om ID-en for erstatningsforpliktelsen, manuelt spore den ned i lageret ditt, flytte alle endringene deres til det forpligte, løse sammenføyningskonflikter, og del deretter deres "nye" endringer med alle en gang til. Tenk deg hva som ville skje i et åpen kildekodeprosjekt med hundrevis av bidragsytere ...

Poenget er, Ikke tilbakestill offentlige forpliktelser, men vær så snill å slette private som du ikke har delt med noen. Vi vil se dette konseptet senere i denne sesjonen.

Tilbakestiller

For å rette opp de problemene som ble innført ved å tilbakestille offentlige forpliktelser, utviklet Git-utviklere en annen måte å angre på forpliktelser: tilbakestillingen. I stedet for å endre eksisterende forpliktelser, legger du til a ny forplikte seg til å angripe problemet:

 git tilbake 

Dette tar endringene i det angitte forbudet, viser ut hvordan du angre dem, og oppretter en ny forpliktelse med den resulterende endringen. Til Git og til andre brukere, gjør tilbakebetalt ser ut og virker som enhver annen forpliktelse - det skjer bare for å angre endringene som ble introdusert av en tidligere forpliktelse.


Løsne en forpliktelse med en tilbakevendende forpliktelse

Dette er den ideelle måten å angre endringer som allerede har blitt forpliktet til et offentlig lager.

om endring

I tillegg til å fullstendig fortryde forpliktelser, kan du også endre den siste forpliktelsen ved å planlegge endringer som vanlig, og deretter kjører:

 git commit --amend

Dette erstatter forrige forpliktelse i stedet for å lage en ny, noe som er veldig nyttig hvis du glemte å legge til en fil eller to. For enkelhets skyld blir pliktereditoren frøet med det gamle forbudets melding. Igjen må du vær forsiktig når du bruker --endre flagg, siden det omskriver historien mye som git reset.


Endring av den siste forpliktelsen

Denne leksjonen representerer et kapittel fra Git Succinctly, en gratis eBok fra teamet på Syncfusion.