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?
891
2
Pirma, visada verta atkreipti dėmesį, kad
git reset --hard
yra potencialiai pavojinga komanda, nes ji panaikina visus neįvestus pakeitimus. Saugumo sumetimais prieš naudodamigit status
visada turėtumėte patikrinti, argit status
išvestis yra švari (t. y. tuščia).Iš pradžių jūs sakote taip:
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
Jei atliksite
git reset --hard
, "Git":master
) grąžins į ``.HEAD
nurodo į jūsų dabartinę šaką (arba dabartinį pakeitimą), todėl viskas, ką padarysgit 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 naudodamigit 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, pof414f31
atliktų pakeitimų nebebus jūsų šakosmaster
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:Išbandykite tai ir pamatysite
git clean -f
.git reset --hard
nepašalins nesekamų failų, ogit-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