Ž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?
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 <SOME-COMMIT>
, "Git":
master
) grąžins į <SOME-COMMIT>
.<SOME-COMMIT>
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"
Į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