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?

Løsning

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 så vil Git gjøre det:

  • Gjør din nåværende gren (vanligvis master) tilbake til å peke på ``.
  • Gjør deretter filene i arbeidstreet ditt og indeksen ("staging area") de samme som versjonene som er committet i ``.

HEADpeker til din nåværende gren (eller nåværende commit), så alt somgit 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"
Kommentarer (9)

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
Kommentarer (13)