Noriu atmesti visus pakeitimus, padarytus po įsipareigojimo <commit-hash>
.
Taigi aš padariau:
git reset --hard <commit-hash>
Dabar tą patį noriu padaryti su savo nuotoliniu įrenginiu. Kaip tai padaryti? Po <commit-hash>
esu atlikęs keletą pakeitimų (ir stūmimų) ir noriu juos visus tiesiog išmesti. Ar tiesiog kažkas baisiai ne taip nutiko, ir aš nenoriu, kad būtų blogiau nei yra ;(
Iš esmės aš noriu atsukti savo origin/master
į <commit-hash>
Darant prielaidą, kad jūsų filialas čia ir nuotoliniu būdu vadinamas master
, o jūsų nuotolinis - origin
, galite padaryti:
git reset --hard <commit-hash>
git push -f origin master
Tačiau turėtumėte vengti tai daryti, jei kas nors kitas dirba su jūsų nuotoline saugykla ir ištraukė jūsų pakeitimus. Tokiu atveju būtų geriau grąžinti tuos pakeitimus, kurių nenorite, ir tada įprastu būdu perkelti.
Atnaujinimas: toliau paaiškinote, kad kiti žmonės ištraukė pakeitimus, kuriuos jūs išstūmėte, todėl geriau sukurti naują pakeitimą, kuris atšauktų visus tuos pakeitimus. Geras paaiškinimas, kaip tai padaryti, pateiktas šiame Jakub Narębski atsakyme. Kuris iš jų patogiausias, priklauso nuo to, kiek pakeitimų norite grąžinti ir kuris metodas jums atrodo prasmingiausias.
Kadangi iš jūsų klausimo aišku, kad jau naudojote git reset --hard
, kad atstatytumėte savo master
šaką, gali tekti pradėti nuo git reset --hard ORIG_HEAD
, kad perkeltumėte savo šaką ten, kur ji buvo anksčiau. (Kaip ir visada, naudodami git reset --hard
, įsitikinkite, kad git status
yra švarus, kad esate tinkamoje šakoje ir kad žinote apie git reflog
, kaip įrankį akivaizdžiai prarastiems pakeitimams atkurti). Taip pat turėtumėte patikrinti, ar ORIG_HEAD
rodo į teisingą pakeitimą, naudodami git show ORIG_HEAD
.
Gedimų šalinimas:
Jei gaunate tokį pranešimą kaip "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"
tuomet turite leisti perrašyti šakos istoriją konkrečiai šakai. Pavyzdžiui, "BitBucket" programoje buvo parašyta "Perrašyti šakos istorijos neleidžiama". Yra žymimasis langelis pavadinimu Leisti perrašyti šakos istoriją
, kurį turite pažymėti.
Jeigu neprieštaraujate, kad prarastumėte vietinius pakeitimus, naudokite kitus atsakymus. Šis metodas vis tiek gali sugriauti nuotolinį, jei pasirinksite netinkamą "commit hash", į kurį norite grįžti.
Jei norite, kad nuotolinis failas sutaptų su vietinėje šakoje jau esančiu pakeitimu:
Nedarykite jokio **atstatymo iš naujo.
Naudodamiesi git log
raskite to įsipareigojimo, kurį norite, kad nuotolinis atstumas atitiktų, hash. git log -p
, kad pamatytumėte pakeitimus, arba git log --graph --all --oneline --decorate
, kad pamatytumėte kompaktišką medį. (Labai patogu pastarąjį variantą turėti kaip slapyvardį savo apvalkale.)
Nukopijuokite hash.
Paleiskite tokią komandą:
Git push --force <remote> <the-hash>:<the remote branch>
pvz.
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master