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:
For å komplisere ting enda lenger, er det flere måter å angre en forpliktelse på. Du kan enten:
Git har et dedikert verktøy for hver av disse situasjonene. La oss starte med 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.
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).
git kassen
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.
git reset
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.
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.
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.
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.
Dette er den ideelle måten å angre endringer som allerede har blitt forpliktet til et offentlig lager.
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
.
Denne leksjonen representerer et kapittel fra Git Succinctly, en gratis eBok fra teamet på Syncfusion.