Tiedän, että Git seuraa sovellukseeni tekemiäni muutoksia ja säilyttää ne, kunnes toimitan muutokset, mutta tässä kohtaa olen jumissa:
Kun haluan palata aiempaan toimitukseen, käytän seuraavaa: Kun haluan palata aiempaan toimitukseen, käytän:
git reset --hard HEAD
Ja Git palauttaa:
HEAD is now at 820f417 micro
Miten palautan sitten kiintolevyllä olevat tiedostot takaisin tuohon edelliseen commitiin?
Seuraavat askeleeni olivat:
git add .
git commit -m "revert"
Mutta mikään tiedosto ei ole muuttunut kiintolevylläni...
Mitä teen oikein/väärin?
Ensinnäkin on aina syytä huomata, että git reset --hard
on mahdollisesti vaarallinen komento, koska se heittää pois kaikki julkaisemattomat muutokset. Varmuuden vuoksi sinun tulisi aina tarkistaa, että git status
:n tuloste on puhdas (eli tyhjä) ennen kuin käytät sitä.
Aluksi sanot seuraavaa:
Tiedän siis, että Git seuraa sovellukseeni tekemäni muutokset ja pitää ne tallessa, kunnes toimitan muutokset, mutta tässä kohtaa olen jumissa:
Se on väärin. Git tallentaa tiedostojen tilan vain silloin, kun lavastat ne (komennolla git add
) tai kun luot commitin. Kun olet luonut commitin, jossa projektisi tiedostot ovat tietyssä tilassa, ne ovat hyvin turvassa, mutta siihen asti Git ei oikeastaan seuraa muutoksia tiedostoihisi. (vaikka esimerkiksi tekisit git add
:n saadaksesi uuden version tiedostosta, se korvaa tiedoston aiemmin varastoidun version varastointialueella).
Kysymyksessäsi kysyt sitten seuraavaa:
Kun haluan palata edelliseen toimitukseen, käytän: git reset --hard HEAD Ja git palauttaa: HEAD on nyt osoitteessa 820f417 micro.
Miten palautan sitten kiintolevyllä olevat tiedostot takaisin tuohon edelliseen commitiin?
Jos teet git reset --hard <SOME-COMMIT>
, niin Git tekee:
master
) takaisin osoittamaan <SOME-COMMIT>
.<SOME-COMMIT>
:ssä siirretyistä versioista.HEAD
osoittaa nykyiseen haaraasi (tai nykyiseen toimitukseen), joten git reset --hard HEAD
heittää pois kaikki toimittamattomat muutokset.
Oletetaan siis, että hyvä muutos, johon haluat palata, on f414f31
. (Löydät sen git log
:n tai minkä tahansa historiaselaimen avulla.) Sinulla on sitten muutama eri vaihtoehto riippuen siitä, mitä haluat tehdä:
Vaihda nykyinen haara osoittamaan vanhempaan toimitukseen. Voit tehdä sen komennolla git reset --hard f414f31
. Tämä kuitenkin kirjoittaa haarasi historian uudelleen, joten sinun kannattaa välttää sitä, jos olet jakanut tämän haaran kenellekään. Myöskään f414f31
:n jälkeen tekemäsi komennot eivät enää ole master
-haarasi historiassa.
Luo uusi toimitus, joka edustaa täsmälleen samaa projektin tilaa kuin f414f31
, mutta lisää sen vain historiaan, joten et menetä mitään historiaa. Voit tehdä sen tässä vastauksessa ehdotettujen vaiheiden avulla - jotakuinkin näin:
f414f31...
git reset --soft HEAD@{1}
git commit -m "Palaan projektin tilaan f414f31"
VAROITUS:
git clean -f
poistaa jäljittämättömät tiedostot, mikä tarkoittaa, että ne ovat poissa lopullisesti, koska niitä ei ole tallennettu arkistoon. Varmista, että haluat todella poistaa kaikki jäljittämättömät tiedostot ennen kuin teet tämän..
Kokeile tätä ja katso git clean -f
.
git reset --hard
ei poista jäljittämättömiä tiedostoja, kun taas git-clean
poistaa kaikki tiedostot jäljitetystä juurihakemistosta, jotka eivät ole Git-seurannassa.
Vaihtoehtoisesti, kuten @Paul Betts sanoi, voit tehdä näin (varo kuitenkin - tämä poistaa myös kaikki huomiotta jätetyt tiedostot).
git clean -df
git clean -xdf
VAROITUS! Tämä poistaa myös huomiotta jätetyt tiedostot