Kaip naudoti „git reset --hard HEAD“, kad grįžtumėte į ankstesnį įvykį?

Žinau, kad „Git“ seka mano pateiktuose pakeitimuose ir saugo juos, kol įvykdysiu pakeitimus, bet čia, kur aš pakabinu:

Kai noriu grįžti prie ankstesnio įsipareigojimo, naudoju:

 git reset --hard HEAD 

Ir git sugrįžta:

 HEAD is now at 820f417 micro 

Kaip tada grąžinti kietajame diske esančius failus į ankstesnį įvykį?

Mano tolesni veiksmai:

 git add . git commit -m "revert" 

Bet nė vienas iš failų nepakeistas mano standžiajame diske ...

Ką aš darau teisingai / neteisingai?

735
02 марта '12 в 9:36 2012-03-02 09:36 nustatė Brian McDonough kovo 2 d. 12 val. 9:36 2012-03-02 09:36
@ 2 atsakymai

Visų pirma, visada verta pažymėti, kad git reset --hard yra potencialiai pavojinga komanda, nes ji pašalina visus jūsų neprisiimtus pakeitimus. Saugumo sumetimais prieš naudojimą visada turėtumėte užtikrinti, kad „ git status būtų švari (t. Y. Tuščia).

Pirmiausia pasakykite:

Taigi, aš žinau, kad „Git“ stebi pakeitimus, kuriuos padariau programoje, ir ji lieka galioti tol, kol nepadarysiu pakeitimų, bet čia, kur aš pakabinu:

Tai neteisinga. „Git“ įrašo tik failų būseną, kai juos įdedate (naudodami „ git add ) arba kai sukuriate įsipareigojimą. Sukūrę įsipareigojimą, kuriame jūsų projekto failai yra tam tikroje būsenoje, jie yra labai saugūs, tačiau iki šiol „Git“ nesekė failų pakeitimų. (Pvz., Net jei padarysite „ git add kad sukurtumėte naują failo versiją, ji perrašys anksčiau parengtą šio failo versiją paruošimo srityje.)

Tuomet jūs klausiate:

Kai noriu grįžti prie ankstesnio įsipareigojimo, naudoju: git reset --hard HEAD ir git grąžina: HEAD dabar yra 820f417 mikro

Kaip vėl gauti mano kietajame diske esančius failus atgal į ankstesnį įvykį?

Jei paleisite git reset --hard <SOME-COMMIT> tada Git bus:

  • Padarykite savo dabartinį filialą (paprastai master ) atgal į <SOME-COMMIT> tašką.
  • Tada atlikite darbinio medžio ir indekso failus („sustojimo zona“) taip pat, kaip ir <SOME-COMMIT> .

HEAD nurodo jūsų dabartinį filialą (arba srovę), taigi viskas, kas git reset --hard HEAD sumažins visus git reset --hard HEAD pakeitimus.

Taigi, tarkime, kad geras įsipareigojimas, kurį norite grąžinti, yra f414f31 . (Ją galite rasti per git log arba bet kurią istoriją.) Tada turite keletą skirtingų parinkčių, priklausomai nuo to, ką norite daryti:

  • Vietoj to, pakeiskite dabartinį filialą, kad nukreiptumėte į senesnį įvykį. Tai galite padaryti su git reset --hard f414f31 . Tačiau tai perrašo jūsų siūlų istoriją, todėl turėtumėte vengti, jei bendrinate šį pokalbį su niekuo. Be to, įsipareigojimai, kuriuos padarėte po f414f31 , nebebus jūsų master filialo istorijoje.
  • Sukurkite naują įsipareigojimą, kuris atitinka tą patį projekto statusą kaip ir f414f31 , bet tiesiog prideda jį prie istorijos, kad neprarastumėte istorijos. Tai galite padaryti naudodami šiame atsakyme siūlomus veiksmus: kažką panašaus į:

     git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 
846
02 марта '12 в 11:32 2012-03-02 11:32 atsakymą pateikė Markas Longairas kovo 2 d. 12 val. 11:32

ĮSPĖJIMAS: git clean -f ištrins nepažymėtus failus, o tai reiškia, kad jie išnyko amžinai, nes jie nėra saugomi saugykloje. Prieš tai atlikdami, įsitikinkite, kad tikrai norite ištrinti visus nepažymėtus failus.


Išbandykite ir žiūrėkite git clean -f .

border=0

git reset --hard nepašalins neištrintų failų, o git-clean pašalins visus failus iš git reset --hard šakninio katalogo, kurie nėra pagal „Git“ sekimą.

Arba, kaip sakė @Paul Betts, galite tai padaryti (bet būkite atsargūs - taip pat pašalinami visi ignoruojami failai)

  • git clean -df
  • git clean -xdf DĖMESIO! Tai taip pat pašalins ignoruojamus failus.
170
02 марта '12 в 9:48 2012-03-02 09:48 atsakymas pateikiamas uday 02 kovo 12 d. 9:48 2012-03-02 09:48

Kiti klausimai apie žymes arba Ask a Question