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?
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 fra git status
er rene (det vil si tomme) før du bruker den.
Innledningsvis sier du følgende:
Så jeg vet at Git sporer endringer jeg gjør i applikasjonen min, og den holder på dem til jeg forplikter endringene, men her er det jeg henger opp:
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ør git 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:
Når jeg vil gå tilbake til en tidligere commit bruker jeg: git reset --hard HEAD Og git returnerer: HEAD er nå på 820f417 micro
Hvordan tilbakestiller jeg deretter filene på harddisken min tilbake til den forrige forpliktelsen?
Hvis du gjør git reset --hard <SOME-COMMIT>
så vil Git gjøre det:
master
) tilbake til å peke på <SOME-COMMIT>
.<SOME-COMMIT>
.HEADpeker 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 via git 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 etter f414f31
vil heller ikke lenger være i historikken til master
-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:
git reset --hard f414f31
git reset --soft HEAD@{1}
git commit -m "Tilbake til tilstanden til prosjektet på f414f31"
ADVARSEL:
git clean -f
vil fjerne usporede filer, noe som betyr at de er borte for godt siden de ikke er lagret i depotet. Forsikre deg om at du virkelig ønsker å fjerne alle usporede filer før du gjør dette..
Prøv dette og se git clean -f
.
git reset --hard
vil ikke fjerne filer som ikke spores, mens git-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