Kaip naudoti 'git reset --hard HEAD', kad grįžtumėte prie ankstesnio pakeitimo?

Žinau, kad "Git" seka mano programos pakeitimus ir juos saugo tol, kol juos patvirtinu, tačiau čia susiduriu su problema:

Kai noriu sugrįžti prie ankstesnio pakeitimo, naudoju:

git reset --hard HEAD

Ir "Git" grąžina:

HEAD is now at 820f417 micro

Kaip tada grąžinti failus į kietąjį diską atgal į ankstesnį pakeitimą?

Mano tolesni veiksmai buvo tokie:

git add .
git commit -m "revert"

Bet nė vienas iš failų nepasikeitė mano kietajame diske...

Ką darau teisingai/neteisingai?

Sprendimas

Pirma, visada verta atkreipti dėmesį, kad git reset --hard yra potencialiai pavojinga komanda, nes ji panaikina visus neįvestus pakeitimus. Saugumo sumetimais prieš naudodami git status visada turėtumėte patikrinti, ar git status išvestis yra švari (t. y. tuščia).

Iš pradžių jūs sakote taip:

Taigi aš žinau, kad "Git" seka mano atliktus programos pakeitimus ir juos saugo tol, kol aš juos patvirtinu, bet štai kur aš užstrigau:

Tai neteisinga. Git įrašo failų būklę tik tada, kai juos pakopuojate (su git add) arba kai sukuriate patvirtinimą. Sukūrus pakeitimą, po kurio projekto failai yra tam tikros būklės, jie yra labai saugūs, tačiau iki tol Git iš tikrųjų nefiksuoja "jūsų failų pakeitimų". (pavyzdžiui, net jei atlikę git add sukursite naują failo versiją, ji perrašys anksčiau sukurtą failo versiją, esančią kūrimo srityje).

Toliau savo klausime klausiate toliau:

Kai noriu grįžti prie ankstesnio pakeitimo, naudoju: git reset --hard HEAD Ir git grąžina: HEAD dabar yra 820f417 micro

Kaip tada grąžinti failus kietajame diske atgal į ankstesnį pakeitimą?

Jei atliksite git reset --hard, "Git":

  • Dabartinę šaką (paprastai master) grąžins į ``.
  • Tada jūsų darbiniame medyje ir rodyklėje ("staging area") esantys failai taps tokie patys, kaip `` perduotos versijos.

HEAD nurodo į jūsų dabartinę šaką (arba dabartinį pakeitimą), todėl viskas, ką padarys git reset --hard HEAD, bus tik tai, kad bus išmesti visi jūsų neperduoti pakeitimai.

Taigi, tarkime, kad geras pakeitimas, prie kurio norite grįžti, yra f414f31. (Jį galite rasti naudodami git log arba bet kurią istorijos naršyklę.) Tada turite keletą skirtingų galimybių, priklausomai nuo to, ką tiksliai norite padaryti:

  • Pakeiskite dabartinę šaką, kad ji nukreiptų į senesnį pakeitimą. Tai galite padaryti naudodami git reset --hard f414f31. Tačiau taip perrašoma jūsų šakos istorija, todėl turėtumėte to vengti, jei šia šaka su kuo nors dalijatės. Be to, po f414f31 atliktų pakeitimų nebebus jūsų šakos master istorijoje.

  • Sukurkite naują įsipareigojimą, kuris atspindėtų lygiai tokią pačią projekto būseną kaip f414f31, bet tik pridėtų jį prie istorijos, kad neprarastumėte jokios istorijos. Tai galite padaryti naudodami šiame atsakyme siūlomus veiksmus - pvz:

      git reset --hard f414f31
      git reset --soft HEAD@{1}
      git commit -m "Grįžtama prie projekto būklės, buvusios f414f31"
Komentarai (9)

ĮSPĖJIMAS: git clean -f pašalins neatsekamus failus, t. y. jų nebeliks visam laikui, nes jie nėra saugomi saugykloje. Prieš atlikdami šį veiksmą įsitikinkite, kad tikrai norite pašalinti visus nesaugomus failus.


Išbandykite tai ir pamatysite git clean -f.

git reset --hard nepašalins nesekamų failų, o git-clean pašalins visus failus iš sekamo šakninio katalogo, kurie nėra "Git" sekami.

Arba, kaip sakė @Paul Betts, galite padaryti taip (tačiau saugokitės - taip pat pašalinami visi ignoruojami failai)

  • git clean -df
  • git clean -xdf ĮSPĖJIMAS! Tai taip pat pašalins ignoruojamus failus
Komentarai (13)