Vil du vite hvordan Git tilbakestille
alternativ fungerer?
I en serie Git-kurs på Envato Tuts +, gikk jeg gjennom noen av de grunnleggende konseptene i Git i enkle videoer.
I denne videoen fra serien leser du alt om Git reset. Du får se hvordan du bruker hver type reset og hvordan disse varianter samhandler med de tre Git-trærne:
Jeg vil også vise deg hvordan du bruker git reset
på enkelte filer.
Git reset. Hva gjør den? Det er hvordan du angre noen endringer som er lokale for datamaskinen din. Når du har gjort noe arbeid som du trenger å spole tilbake, er reset din venn. Du kan bare begynne igjen. Du kan hoppe frem og tilbake mellom innholdet i ulike forpliktelser og gjøre litt tid på reise.
Du har noen alternativer til din disposisjon med git reset. Du kan gå hardt, mykt og blandet, og du kan også betjene og holde bindingsobjekter eller gjøre det på et individuelt filnivå.
Hver av disse tre variasjonene påvirker bestemte trær som git bruker til å håndtere filene og innholdet deres.
Metaforisk sett forandrer alle tilbakestillingsalternativer et annet tre, en annen del av hvordan git lagrer øyeblikksbilder.
Trær, hva snakker vi om her? Git bruker arbeidskatalogen, indeksen (også kjent som staging-området), og noe som heter HEAD for å lage og hente forpliktelser.
I arbeidskatalogen kan du endre filer som du kan legge inn i indeksen. Med dette oppføringsområdet kan du finjustere og velge hva du vil sette inn i ditt neste forpliktelse. Et commit-objekt er en kryptografisk hashed-versjon av innholdet ditt. Den har noen lagt til metadata og peker tilbake til tidligere forpliktelser som lar oss gjøre vår tid på reisebiter.
HEAD er en referanse som peker på slike begjæringsobjekter. Det er bare en peker som oppdaterer med hver ny forpliktelse eller endring av grenen. Du kan flytte den rundt og målrette et hvilket som helst punkt i tid med commit-objektet.
For mer info om trær og slikt, ta en titt på videoen min om de tre trærne og Git. Den dekker den grunnleggende arbeidsflyten i Git og er et solid grunnlag for å bedre forstå logikken for å bruke git reset.
La oss nå se på de forskjellige alternativene.
Dette går hele ni meter. Det vil først flytte HEAD og oppdatere indeksen med innholdet i commit-HEAD er nå peker på. Deretter vil det oppdatere arbeidskatalogen med innholdet i indeksen, og dermed ødelegge innholdet du endret i arbeidskatalogen.
Derfor er det den eneste versjonen av git reset som er litt farlig hvis du ikke vet hva du gjør.
Dette vil flytte HEAD og også oppdatere indeksen med innholdet i ønsket commit som HEAD ikke peker på. Arbeidsoversikten er upåvirket av den operasjonen.
Det blandede alternativet er standard hvis du ikke gir git reset med et alternativ. Det er alltid arbeidskatalog trygt, så du trenger ikke å være redd for å miste arbeidet ditt.
Dette alternativet flyttes bare HEAD og stopper der. I virkeligheten vil dette angre den siste git commit-kommandoen.
Arbeidskatalogen og filene som kan bli arrangert, er fortsatt upåvirket av den operasjonen.
Med alle disse alternativene for git reset, spesifiserer du spesifikt git hvor du skal slutte å spille igjen, spole inn innholdet og filene fra tidligere forpliktelser for å spesifisere trærne du vil påvirke. Vi kan ta dette et skritt videre og programgjenopprett med en filsti.
Hvis du bruker en bane, vil Git ikke flytte HEAD. Hvorfor? Fordi HEAD peker på et commit-objekt, og det kan ikke peke på bare en delmengde av det. Med andre ord peker HEAD ikke på bestemte filer, men å begå objekter, som består av blokkfiler og noen metadata. Indeks- og arbeidskatalogen, derimot, kan adresseres i skiver av sorter.
Bare indeks- og arbeidskatalogen spiller en rolle når du bruker en bane. Den kopierer bare innholdet i en fil i indeksen, og det kan ikke gjøre mye annet. git reset noen-file.ext
forutsetter at du som standard mente git reset - blandet HEAD litt-file.ext
og vil ikke påvirke arbeidskatalogen.
Forresten, fordi HEAD ikke kan bevege seg, ville det myke alternativet være meningsløst. La oss si at du har jobbet med versjon 3 av en fil og lagt den til indeksen for din neste kommentar. Nå vil du fjerne disse endringene. Løpe git reset noen-file.ext
å unstage den aktuelle filen.
Som et resultat vil indeksen bli fylt ut av tilstanden til filen din fra versjon 2, versjonen fra den forrige forplikte seg til å forpeke HEAD peker på. Endringene du gjorde i filen, versjon 3, er i utgangspunktet fortsatt tilgjengelig i arbeidskatalogen. Du kan fortsatt få disse endringene til sceneversjon 3 av denne filen.
Så hva gjør du i kraft med git reset noen-file.ext
er du bare manipulere indeksen.
Hva med git reset - hard some-file.ext
? Hvorfor kan vi ikke bruke det også?
Denne funksjonaliteten utføres av git kassen
med et filnavn. git checkout noen-file.ext
er faktisk hva git reset - hard some-file.ext
ville gjøre, men Git lar oss ikke bruke det harde alternativet.
La oss ta et nytt skritt videre. Vi kan målrette mot eventuelle forpliktelser for å tilbakestille en bestemt fil, ikke bare den nyeste som er representert av HEAD. Dette tilbakestiller målrettede filer i indeksen til tilstanden til en viss forpliktelse, igjen uten å påvirke arbeidskatalogen eller noen forpliktelse.
Etter at du har tilbakestilt indeksen til tilstanden til en bestemt forpliktelse, kan du bruke en bakoveroppdatering av sorter git kassen
med et filnavn for å sjekke innholdet i indeksen i arbeidskatalogen.
Hvorfor bruke kassen? Fordi git reset - hard
med en fil er ikke noe Git lar deg gjøre.
Men vær forsiktig. Ved hjelp av git kassen
med en filsti vil du kvitte deg med de nyeste endringene i arbeidskatalogen din og erstatte den med versjonen av filen i det bestemte commitet.
Hvis du fant dette nyttig, hvorfor ikke sjekk ut noen flere Git-kurs?
Du kan se vår Introduksjon til Git og GitHub, eller prøv de andre Coffee Break-kursene i denne serien: