Hvordan bruker jeg 'git reset --hard HEAD' for å gå tilbake til en tidligere commit?
Jeg vet at Git sporer endringer jeg gjør i applikasjonen min, og den holder på dem til jeg begår endringene, men her er det jeg henger opp:
Når jeg ønsker å gå tilbake til en tidligere commit jeg bruker:
git reset --hard HEAD
Og Git returnerer:
HEAD is now at 820f417 micro
Hvordan tilbakestiller jeg filene på harddisken tilbake til den forrige overføringen?
Mine neste skritt var:
git add .
git commit -m "revert"
Men ingen av filene har endret seg på harddisken min...
Hva gjør jeg riktig/galt?
891
2
For det første er det alltid verdt å merke seg at
git reset --hard
er en potensielt farlig kommando, siden den kaster bort alle ikke-bekreftede endringer. For sikkerhets skyld bør du alltid sjekke at utdataene fragit status
er rene (det vil si tomme) før du bruker den.Innledningsvis sier du følgende:
Det er feil. Git registrerer bare tilstanden til filene når du iscenesetter dem (med
git add
) eller når du oppretter en commit. Når du har opprettet en commit som har prosjektfilene dine i en bestemt tilstand, er de veldig trygge, men inntil da sporer ikke Git egentlig endringer i filene dine. (for eksempel, selv om du gjørgit add
for å iscenesette en ny versjon av filen, overskriver det den tidligere iscenesatte versjonen av den filen i iscenesettelsesområdet).I spørsmålet ditt fortsetter du med å spørre følgende:
Hvis du gjør
git reset --hard
så vil Git gjøre det:master
) tilbake til å peke på ``.HEAD
peker til din nåværende gren (eller nåværende commit), så alt som
git reset --hard HEAD` vil gjøre er å kaste bort eventuelle ukommiterte endringer du har.Så, anta at den gode commit som du ønsker å gå tilbake til er
f414f31
. (Du kan finne det viagit log
eller en hvilken som helst historikk-nettleser.) Du har da noen forskjellige alternativer avhengig av nøyaktig hva du vil gjøre:Endre din nåværende gren til å peke til den eldre commit i stedet. Du kan gjøre det med
git reset --hard f414f31
. Dette omskriver imidlertid historikken til grenen din, så du bør unngå det hvis du har delt denne grenen med noen. Overføringene du gjorde etterf414f31
vil heller ikke lenger være i historikken tilmaster
-grenen din.Opprett en ny commit som representerer nøyaktig samme tilstand av prosjektet som
f414f31
, men bare legger den til i historikken, slik at du ikke mister noen historikk. Du kan gjøre det ved å bruke trinnene som er foreslått i dette svaret - noe sånt som:Prøv dette og se
git clean -f
.git reset --hard
vil ikke fjerne filer som ikke spores, mensgit-clean
vil fjerne alle filer fra den sporede rotkatalogen som ikke er under Git-sporing.Alternativt, som @Paul Betts sa, kan du gjøre dette (vær imidlertid forsiktig - det fjerner også alle ignorerte filer)
git clean -df
git clean -xdf
FORSIKTIG! Dette vil også slette ignorerte filer