Kaip grąžinti „Git“ saugyklą į ankstesnį įvykį

Kaip aš galiu grįžti iš esamos būsenos į momentinę nuotrauką, padarytą naudojant tam tikrą pataisą?

Jei aš git log , tada gausiu tokią išvestį:

 $ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b' Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <me@me.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <me@me.com> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah. 

Kaip grįžti į fiksavimą nuo lapkričio 3 d. pataisyti 0d1d7fc ?

6500
06 нояб. nustatė Crazy Serbija 2010-11-06 19:58 '10, 19:58, 2010-11-06 19:58
ответ 41 atsakymas
  • 1
  • 2

Tai labai priklauso nuo to, ką reiškia „grįžti“.

Laikinai pereikite prie kito nustatymo.

Jei norite laikinai grįžti prie jo, apgauti save ir grįžti į ten, kur esate, viskas, ką jums reikia padaryti, tai patikrinti norimą fiksaciją:

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 

Jei išjungėte, jau atsisakėte vietinių pakeitimų, tačiau galite bent jau grįžti į ten, kur buvote anksčiau, vėl nustatydami nustatymus.

Atšaukti paskelbti įsipareigoja su naujais įsipareigojimais

Kita vertus, jei paskelbėte šį darbą, tikriausiai nenorite atstatyti filialo, nes jis efektyviai perrašo istoriją. Tokiu atveju galite tikrai grąžinti įsipareigojimą. Naudojant „Git“, sugrįžimas turi labai specifinę reikšmę: sukurkite įsipareigojimą, naudojant atvirkštinį pleistrą, kad jį atšauktumėte. Taigi nereikia perrašyti jokios istorijos.

git-revert tikrai apima daug šio aprašymo.  Kita naudinga nuoroda yra „git-scm.com“ skyrius, kuriame aptariamas „git-revert“ . 

Jei nuspręsite, kad nenorite grįžti, galite grįžti atgal (kaip aprašyta čia) arba grįžti prieš sugrįždami (žr. Ankstesnį skyrių).

Taip pat galite rasti šį atsakymą naudinga šiuo atveju:
Kaip perkelti galvą atgal į ankstesnę vietą? (Atskira galva)

8356
06 нояб. Atsakymą pateikė Cascabel, lapkričio 6 d. 2010-11-06 20:04 '10, 20:04, 2010-11-06 20:04

Grąžinkite darbo kopiją į paskutinį įvykį

Jei norite grįžti į ankstesnį įvykį, ignoruodami bet kokius pakeitimus:

 git reset --hard HEAD 

kur HEAD yra paskutinis jūsų dabartinio gijos fiksavimas.

border=0

Darbo kopijos grąžinimas vyresniam įvykiui

Jei norite grįžti į įsipareigojimą, kuris yra didesnis nei paskutinis įsipareigojimas:

1396
21 авг. boulder_ruby atsakymas rugpjūčio 21 d 2012-08-21 09:19 '12 at 9:19 2012-08-21 09:19

Yra daug sunkių ir pavojingų atsakymų, tačiau iš tikrųjų tai lengva:

 git revert --no-commit 0766c053..HEAD git commit 

Tai grįš viską nuo HEAD iki hash įsipareigojimo, o tai reiškia, kad jis atkuria šį įsipareigojimo būseną darbo medyje, tarsi kiekvienas įsipareigojimas nuo to laiko būtų grąžintas. Tada galite išspręsti dabartinį medį ir sukurti visiškai naują pataisą, iš esmės atitinkančią „grąžintą“ pataisą.

(Vėliava --no-commit leidžia gitui sugrįžti vienu metu - kitaip jums bus paprašyta išsiųsti pranešimą kiekvienam įvykiui, esančiam diapazone, pakratant savo istoriją nereikalingais naujais įsipareigojimais.)

Tai saugus ir paprastas būdas grįžti į ankstesnę būseną . Istorija nėra sunaikinta, todėl ji gali būti naudojama jau paskelbtiems įsipareigojimams.

1361
12 февр. atsakymą pateikė yarin , 12 2014-02-12 07:18 '14 at 7:18 AM 2014-02-12 07:18

Geriausias variantas man ir galbūt kitiems yra „Git“ iš naujo parinktis:

 git reset --hard <commidId>  git clean -f 

Tai buvo geriausias pasirinkimas man! Tai paprasta, greita ir efektyvi!


Pastaba: kaip minėta komentaruose, nedarykite to, jei bendrinate filialą su kitais žmonėmis, turinčiais senų įsipareigojimų kopijas.

Taip pat iš komentarų, jei norite naudoti mažiau „balzy“ metodą, galite naudoti

git clean -i

173
22 окт. Atsakymą pateikė Pogrindis spalio 22 d. 2013-10-22 14:53 '13, 14:53, 2013-10-22 14:53

Prieš atsakydami pridėkite šiek tiek fono, paaiškindami, kas HEAD .

First of all what is HEAD?

HEAD yra tiesiog nuoroda į dabartinę srovę (paskutinę), padarytą dabartiniame sriegyje. Bet kuriuo metu gali būti tik vienas HEAD (be git worktree ).

HEAD saugomas .git/HEAD viduje ir juose yra 40 baitų SHA-1 srovės.


detached HEAD

Jei nesinaudojate paskutiniuoju įvykiu, tai reiškia, kad HEAD nurodo ankstesnį įvykį istorijoje, tai vadinama detached HEAD .

2019

06 февр. Atsakymas duotas CodeWizard 06 Feb. 2015-02-06 00:56 '15 - 0:56 2015-02-06 00:56

Jei norite užblokuoti, ištrinti paskutinį įvykio pranešimą ir įdėkite modifikuotus failus į eilę, turėtumėte naudoti komandą:

 git reset --soft HEAD~1 
  • --soft nurodo, kad atrakinti failai turėtų būti išsaugoti kaip darbo failai, priešingai nei --hard .
  • HEAD~1 - paskutinis pataisymas. Jei norite atkurti 3 pataisymus, galite naudoti HEAD~3 . Jei norite grįžti prie konkretaus redagavimo numerio, galite tai padaryti naudodami SHA-hash.

Tai yra labai naudinga komanda situacijose, kai padarėte neteisingą dalyką ir norite atšaukti šį paskutinį įvykį.

Šaltinis: http://nakkaya.com/2009/09/24/git-delete-last-commit/

116
04 марта '14 в 20:25 2014-03-04 20:25 Atsakymą pateikė Stephen Ostermiller kovo 14 d. 14 d. 20:25 2014-03-04 20:25

Bandžiau daug būdų atšaukti vietinius „Git“ pakeitimus, ir atrodo, kad jis geriausiai veikia, jei tiesiog norėtumėte grįžti į paskutinę įvykdymo būseną.

 git add .  git checkout master -f 

Trumpas aprašymas:

  • Jis nesukurs jokių įsipareigojimų, nes git revert .
  • Jis nepašalins jūsų HEAD kaip „ git checkout <commithashcode> .
  • Jis pakeis visus vietinius pakeitimus ir pašalins visus pridėtus failus nuo paskutinio įvykio pokalbyje.
  • Jis veikia tik su šakų pavadinimais, todėl jūs galite tik grįžti į paskutinį įvykį filiale.

Radau daug patogesnį ir paprastesnį būdą pasiekti anksčiau pateiktus rezultatus:

 git add .  git reset --hard HEAD 

kur HEAD nurodo paskutinį įvykį jūsų dabartiniame gijoje.

Tai tas pats kodas, kaip boulder_ruby, bet pridėjau git add . prieš git reset --hard HEAD kad ištrintumėte visus naujus failus, sukurtus nuo paskutinio įsipareigojimo, nes dauguma žmonių tikisi, kai grįšiu prie paskutinio įsipareigojimo.

104
29 июля '12 в 14:01 2012-07-29 14:01 atsakymas pateikiamas romėnų Minenokui liepos 12 d., 12 val

Tai galite padaryti naudodami dvi komandas:

 git reset --hard [previous Commit SHA id here] git push origin [branch Name] -f 

Jis pašalins ankstesnį „Git“ įvykį.

Jei norite išsaugoti pakeitimus, galite naudoti:

 git reset --soft [previous Commit SHA id here] 

Tada jis išsaugos jūsų pakeitimus.

90
12 дек. Atsakymas pateikiamas kiran boghra 12 d. 2014-12-12 09:52 '14 - 9:52 2014-12-12 09:52

Tarkime, kad teksto faile, pavadintame ~/commits-to-revert.txt turite šiuos ~/commits-to-revert.txt (naudojosi git log --pretty=oneline , kad juos gautumėte)

 fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219 0c27ecfdab3cbb08a448659aa61764ad80533a1b f85007f35a23a7f29fa14b3b47c8b2ef3803d542 e9ec660ba9c06317888f901e3a5ad833d4963283 6a80768d44ccc2107ce410c4e28c7147b382cd8f 9cf6c21f5adfac3732c76c1194bbe6a330fb83e3 fff2336bf8690fbfb2b4890a96549dc58bf548a5 1f7082f3f52880cb49bc37c40531fc478823b4f5 e9b317d36a9d1db88bd34831a32de327244df36a f6ea0e7208cf22fba17952fb162a01afb26de806 137a681351037a2204f088a8d8f0db6e1f9179ca 

Sukurkite „ bash shell“ scenarijų, kad grąžintumėte kiekvieną iš jų:

55
14 окт. atsakymą pateikė Lance Caraccioli 14 okt. 2011-10-14 00:51 '11 prie 0:51 2011-10-14 00:51

Papildomos Jefromi sprendimų alternatyvos

„Jefromi“ sprendimai tikrai yra geriausi, ir jūs turėtumėte juos naudoti. Vis dėlto, norint išsiaiškinti, taip pat norėjau parodyti šiuos kitus alternatyvius sprendimus, kurie taip pat gali būti naudojami sugrąžinti įsipareigojimą (ta prasme, kad jūs sukuriate naują įsipareigojimą, kuris pakeičia ankstesnio įsipareigojimo pakeitimus, nes git revert ).

Kad būtų aišku, šios alternatyvos nėra geriausias būdas grįžti prie „ Jefromi“ sprendimų , bet noriu tik nurodyti, kad jūs taip pat galite naudoti šiuos kitus metodus, kad pasiektumėte tą patį lygį kaip „ git revert .

1 alternatyva: kietas ir minkštas atstatymas

Ar tai yra šiek tiek pakeista Charleso Bailey sprendimo versija, pagal kurią „ Get SHA-hash“ sugrįžta į „Git“? :

53
29 июня '14 в 20:51 2014-06-29 20:51 atsakymą pateikė vartotojo456814 birželio 29 d. 14, 20:51 2014-06-29 20:51

Nieko čia nieko nedarė, išskyrus šį tikslų derinį:

 git reset --hard <commit_hash> git push origin <branch_name> --force 

Čia raktas yra priverstinis stūmimas, jokių papildomų pranešimų apie tvirtinimą / tvirtinimą ir kt.

53
13 февр. atsakymas pateikiamas serdarsenay 13 vas . 2018-02-13 01:40 '18 prie 1:40 2018-02-13 01:40

Čia yra daug paprastesnis būdas grįžti į ankstesnį įvykį (ir jį tvarkyti nevaldomoje valstybėje, daryti viską, ką norite su juo):

 git reset HEAD~1 

Taigi nereikia nustatyti identifikatorių ir tt :)

50
29 февр. atsakymą pateikė Paul Walczewski , vasario 29 d. 2016-02-29 11:40 '16 at 11:40 2016-02-29 11:40

Gerai, atgal į ankstesnį įsipareigojimą git yra gana paprasta ...

Grąžinti nepakeitę pakeitimų:

 git reset --hard <commit> 

Grįžkite atgal ir išsaugokite pakeitimus:

 git reset --soft <commit> 

Paaiškinkite, kad, naudodami git reset, galite atkurti tam tikrą būseną, paprastai su pasipriešinimo maišais, kaip matėte aukščiau.

Tačiau, kaip matote, skirtumas yra naudojant dvi vėliavas --hard ir --hard , numatytasis yra git reset naudojant --soft vėliavą, bet visada rekomenduojama naudoti šią vėliavą, paaiškinu kiekvieną vėliavą:


--soft

Numatytoji vėliava, kaip paaiškinta, nereikalauja, kad ji būtų pateikta, nekeičia darbo medžio, bet prideda visus pakeitimo failus, kurie bus paruošti, todėl grįšite į įsipareigojimo būseną, kurioje failo pakeitimai nekeičiami.


-

Būkite atsargūs su šia vėliava, jis atstato darbo medį ir visi stebimų failų pakeitimai išnyksta!


Taip pat sukūriau žemiau esantį vaizdą, kuris gali vykti realiame gyvenime dirbant su git:

2019

20 июля '17 в 18:55 2017-07-20 18:55 Atsakymą Alireza pateikė liepos 17 d. 17 val. 18:55 2017-07-20 18:55

Darant prielaidą, kad kalbate apie priimančiąją ir atitinkamą filialą (tai rodo, kad tai gali būti bet koks darbas, kurį nerimaujate):

 # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master 

Radau atsakymą iš dienoraščio įrašo Ištrinti nuotolinį „Git“ saugyklą konkrečiam įvykiui .

45
10 мая '16 в 20:21 2016-05-10 20:21 atsakymas į Markreyes gegužės 10, 16, 20:21 2016-05-10 20:21

Po visų pakeitimų, kai paspausite visas šias komandas, gali tekti naudoti:

 git push -f ... 

Ir ne tik git push .

34
05 сент. atsakymą pateikė sivi 05 sep . 2013-09-05 17:03 '13, 17:03, 2013-09-05 17:03

Yra komanda (kuri nėra „Git“ branduolio dalis, bet ji yra „ git-extras“ pakete), skirta grąžinti ir vykdyti senus įsipareigojimus:

 git back 

Man“ puslapyje jis taip pat gali būti naudojamas:

 # Remove the latest three commits git back 3 
32
08 авг. atsakymą pateikė Shadow Man 08 rug. 2013-08-08 21:30 '13, 21:30, 2013-08-08 21:30

Grįžkite į paskutinį įvykį ir ignoruokite visus vietinius pakeitimus:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 Atsakymą pateikė Mohammedas Irfanas Tirupatturas liepos 16 d. 16:13 2016-07-26 16:13

Pasirinkite reikiamą laikiklį ir patikrinkite.

 git show HEAD git show HEAD~1 git show HEAD~2 

kol gausite norimą fiksavimą. Norėdami priversti HEAD atkreipti dėmesį į tai, atlikite

 git reset --hard HEAD~1 

arba git reset --hard HEAD~2 arba kažkas kita.

26
26 февр. atsakymas pateikiamas tonythomas01 26 vasaris 2014-02-26 15:52 '14 at 15:52 2014-02-26 15:52

Šiuos pradinius veiksmus galite atlikti patys ir grįžti į git-repo.

  1. Iš „Bitbucket“ git pull --all naujausią savo saugyklos versiją naudodami komandą „Git git pull --all -all“.

  2. Paleiskite git log komandą su -n 4 iš savo terminalo. Numeris po „-n“ nustato žurnale padarytų įsipareigojimų skaičių, pradedant nuo paskutinio įvykio vietos istorijoje.

    $ git log -n 4

  3. Atstatykite git reset --hard HEAD~N savo saugyklos istoriją, naudodami git reset --hard HEAD~N kur N yra sugrąžinamų įsipareigojimų skaičius. Toliau pateiktame pavyzdyje galvutė bus nustatyta į vieną įvykį, paskutinis įvykdymas saugyklos istorijoje:

  4. Paspauskite „git repo“ pakeitimą su „ git push --force kad priverstumėte pakeisti.

Jei norite, kad „Git“ saugykla turėtų ankstesnį įsipareigojimą

 git pull --all git reset --hard HEAD~1 git push --force 
24
06 апр. Nanhe Kumar atsakymas, pateiktas 06.04 2017-04-06 15:20 '17 at 15:20 2017-04-06 15:20

Tai dar vienas tiesioginio atkūrimo metodas neseniai įvykdytam įvykiui.

 git stash git stash clear 

Jis tiesiogiai pašalina visus pakeitimus, atliktus nuo paskutinio įsipareigojimo.

PS: Jis turi mažai problemų; jis taip pat ištrina visus neseniai išsaugotus talpyklos pakeitimus. Manau, kad daugeliu atvejų tai nėra svarbu.

20
05 мая '16 в 14:43 2016-05-05 14:43 atsakymą pateikė „ Point Networks“ 05 gegužės 16 d. 14:43 2016-05-05 14:43

Norėdami visiškai išvalyti kodavimo katalogą iš kai kurių atsitiktinių pakeitimų, naudojome:

 git add -A . git reset --hard HEAD 

Tiesiog git reset --hard HEAD atsikratys pakeitimų, tačiau jis nebus atsikratęs „naujų“ failų. Jų atveju jie atsitiktinai nutempė svarbų aplanką, o visi šie failai buvo apdoroti kaip nauji su „Git“, todėl reset --hard nepašalino. „ git add -A . iš anksto jis aiškiai stebėjo juos visus su „Git“, kuris buvo sunaikintas iš naujo.

20
11 окт. Chris Moschini atsakymas, pateiktas spalio 11 d 2015-10-11 03:10 '15 at 3:10 2015-10-11 03:10

Norėdami išsaugoti pakeitimus iš ankstesnio įsipareigojimo HEAD ir eiti į ankstesnį įvykį, vykdykite:

 git reset <SHA> 

Jei iš ankstesnio įsipareigojimo HEAD nereikia keisti pakeitimų ir paprasčiausiai atsisakyti visų pakeitimų, atlikite šiuos veiksmus:

 git reset --hard <SHA> 
20
28 июля '15 в 11:35 2015-07-28 11:35 atsakymą pateikė Vishnu Atrai liepos 28 d. 15 val. 11:35 2015-07-28 11:35

Manau, kad kai kurie žmonės gali kreiptis į šį klausimą, norėdami sužinoti, kaip atkuriant pakeitimus jie padarė jų savininką - tai yra, viską išmeskite ir grįžkite į kilmę / savininką, ir šiuo atveju atlikite šiuos veiksmus:

 git reset --hard origin/master 

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

19
05 февр. atsakymas pateikiamas 05 m. vasario mėn . 2015-02-05 04:28 '15 at 4:28 2015-02-05 04:28

Atšaukti yra pavedimas įvykdyti įsipareigojimus.

 git revert <commit1> <commit2> 

Pavyzdys:

git revert 2h3h23233

Jis gali gauti diapazoną nuo galvos, kaip parodyta žemiau. Čia 1 sako: "Grąžinti paskutinį pataisymą".

git revert HEAD~1..HEAD

ir tada pasidaryk git push

16
20 авг. atsakymas, kurį pateikė Sireesh Yarlagadda 20 rug . 2015-08-20 17:45 '15, 17:45 pm 2015-08-20 17:45

Atnaujinti naujausius įsipareigojimus:

 git reset --hard HEAD 

HEAD yra tiesiog nuoroda į dabartinę srovę (paskutinę), padarytą dabartiniame sriegyje. Bet kuriuo metu gali būti tik vienas HEAD .

Grįžti į senesnę komandą: greičiausias būdas atkurti seną versiją yra naudoti iš reset komandą:

 # Resets index to former commit git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} # Updates working copy to reflect the new commit git reset --hard 

Tai perkelia jūsų HEAD filialą į nurodytą versiją. Visi įsipareigojimai, atsiradę po šios versijos iš tikrųjų atšaukti; jūsų projektas yra lygiai toks pat, kaip tuo metu.

Atstatymo komanda turi kelias parinktis, viena iš įdomiausių yra --soft vėliava. Jei jį naudosite vietoj „ --hard , „Git“ išsaugos visus „neatšauktus“ pakeitimus kaip vietinius pakeitimus.

Versijos atkūrimas naujame vietiniame skyriuje

Kaip jau buvo minėta, naudojant HEAD filialo atkūrimo komandą yra gana radikalus veiksmas: jis pašalins visus įsipareigojimus (šiame filiale), kurie atsirado po nurodytos peržiūros. Jei esate tikri, kad tai yra tai, ko norite, viskas yra tvarkinga.

Tačiau taip pat yra saugesnis būdas, jei pasirinksite palikti dabartinę HEAD filialą nepaliestą. Так как "ветки" настолько дешевы и легки в Git, мы можем легко создать новую ветку, которая начинается с этой старой версии:

 git checkout -b old-project-state 0ad5a7a6