Kako vratiti Git spremište na prethodnu predaju

Kako se mogu vratiti iz trenutačnog stanja u snimku snimljenu na određeno rješenje?

Ako radim git log , dobivam sljedeći izlaz:

 $ 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. 

Kako se vratiti na fiksaciju od 3. studenog, tj. popraviti 0d1d7fc ?

6500
06 нояб. postavio Crazy Serb 06 Nov. 2010-11-06 19:58 '10 u 19:58 2010-11-06 19:58
ответ 41 odgovor
  • 1
  • 2

Mnogo ovisi o tome što mislite pod "povratiti".

Privremeno se prebacite na drugi popravak.

Ako se želite privremeno vratiti na nju, zavaravajte se, a zatim se vratite tamo gdje se nalazite, sve što trebate učiniti jest provjeriti željenu fiksaciju:

 # 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. 

Ako ste zabrljali, već ste ispustili lokalne promjene, ali barem se možete vratiti na mjesto na kojem ste bili prije ponovnog postavljanja postavki.

Odustani objavljene objave s novim izvršenjima

S druge strane, ako ste objavili ovo djelo, vjerojatno ne želite poništiti granu jer ona zapravo prerađuje priču. U ovom slučaju, možete stvarno vratiti urezivanje. Uz Git, vraćanje ima vrlo specifično značenje: stvorite predaju pomoću obrnute zakrpe da biste je poništili. Dakle, ne prepravljate nijednu priču.

git-revert pokriva mnogo toga u opisu.  Još jedna korisna veza je odjeljak git-scm.com, koji opisuje git-revert . 

Ako odlučite da se na kraju ne želite vratiti, možete vratiti unatrag (kao što je ovdje opisano) ili se vratiti prije povratka (pogledajte prethodni odjeljak).

Ovaj je odgovor također od pomoći u ovom slučaju:
Kako premjestiti glavu natrag na prethodno mjesto? (Odvojena glava)

8356
06 нояб. Odgovor daje Cascabel 06. studenog. 2010-11-06 20:04 '10 u 20:04 2010-11-06 20:04

Vratite radnu kopiju u zadnju pohranu

Za povratak na prethodnu predaju, zanemarujući sve promjene:

 git reset --hard HEAD 

gdje je HEAD posljednji popravak u vašoj trenutnoj niti.

border=0

Vraćanje radne kopije starijoj naredbi

Za povratak na urezivanje, koje je veće od zadnjeg urezivanja:

1396
21 авг. boulder_ruby odgovori Aug 21 2012-08-21 09:19 '12 u 9:19 2012-08-21 09:19

Postoji mnogo teških i opasnih odgovora, ali zapravo je lako:

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

To će vratiti sve od HEAD do hash commita, što znači da ponovno kreira ovo stanje u radnom stablu, kao da je svaki komad od tada vraćen. Tada možete popraviti trenutno stablo i stvorit će potpuno novi popravak, bitno ekvivalentan popravku koji ste "vratili".

(Zastava - no --no-commit dopušta git-u da vrati sve izvršene u isto vrijeme - inače ćete biti upitani za slanje poruke za svaku predaju u rasponu, bacanje povijesti na nepotrebne nove objave.)

To je siguran i jednostavan način za povratak u prethodno stanje . Povijest nije uništena, tako da se može upotrijebiti za objave koje su već objavljene.

1361
12 февр. odgovor je dao Yarin 12. veljače. 2014-02-12 07:18 '14 at 7:18 2014-02-12 07:18

Najbolja opcija za mene, a možda i za druge, je opcija Git reset:

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

To je bila najbolja opcija za mene! Jednostavno je, brzo i učinkovito!


Napomena: Kao što je spomenuto u komentarima, nemojte to učiniti ako dijelite svoje podružnice s drugim osobama koje imaju kopije starih obveza.

Također iz komentara, ako želite koristiti manje "ballzy" metodu, možete koristiti

git clean -i

173
22 окт. Odgovor je dao Pogrindis 22. listopada. 2013-10-22 14:53 '13 u 14:53 2013-10-22 14:53

Prije odgovora dodajte malo pozadine, objašnjavajući što je HEAD .

First of all what is HEAD?

HEAD je jednostavno referenca na trenutnu (posljednju) obvezu u trenutnoj niti. U bilo koje vrijeme može postojati samo jedna HEAD (isključujući git worktree ).

Sadržaj HEAD pohranjuje se unutar .git/HEAD i sadrži 40 bajtova SHA-1 tekućeg urezivanja.


detached HEAD

Ako ne koristite posljednju naredbu, to znači da HEAD ukazuje na prethodnu predaju u povijesti, naziva se detached HEAD .

2019

06 февр. Odgovor je dan CodeWizard 06. veljače. 2015-02-06 00:56 '15 u 0:56 2015-02-06 00:56

Ako želite overclockati, izbrisati posljednju poruku urezivanja i staviti izmijenjene datoteke u red čekanja, upotrijebite naredbu:

 git reset --soft HEAD~1 
  • --soft označava da otključane datoteke trebaju biti spremljene kao radne datoteke, nasuprot --hard , koje ih odbacuju.
  • HEAD~1 - posljednji popravak. Ako želite vratiti 3 popravka, možete koristiti HEAD~3 . Ako se želite vratiti na određeni broj revizije, to možete učiniti i pomoću SHA-hash-a.

Ovo je iznimno korisna naredba u situacijama u kojima ste učinili pogrešnu stvar i želite otkazati ovu zadnju objavu.

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

116
04 марта '14 в 20:25 2014-03-04 20:25 Odgovor daje Stephen Ostermiller 4. ožujka 2014. u 20:25 2014-03-04 20:25

Pokušao sam mnogo načina poništavanja lokalnih promjena u Git-u, a čini se da najbolje funkcionira ako se samo želite vratiti na zadnje stanje urezivanja.

 git add .  git checkout master -f 

Kratki opis:

  • To neće stvoriti bilo kakve objave, kao što se git revert .
  • Neće odvojiti vašu HEAD kao git checkout <commithashcode> .
  • Poništit će sve vaše lokalne promjene i ukloniti sve dodane datoteke od zadnjeg urezivanja u niti.
  • Radi samo s imenima grana, tako da se na ovaj način možete vratiti samo na posljednji urez.

Našao sam mnogo prikladniji i jednostavniji način za postizanje gore navedenih rezultata:

 git add .  git reset --hard HEAD 

gdje HEAD označava posljednji urez u trenutnoj niti.

Ovo je isti kôd kao i boulder_ruby, ali dodao sam git add . prije git reset --hard HEAD za brisanje svih novih datoteka stvorenih od zadnjeg git reset --hard HEAD , jer to je ono što većina ljudi očekuje kada se vratim na posljednju predaju.

104
29 июля '12 в 14:01 2012-07-29 14:01 odgovor je dat Roman Minenok 29. srpnja '12 u 14:01 2012-07-29 14:01

To možete učiniti pomoću sljedeće dvije naredbe:

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

Uklonit će prethodnu Git obvezu.

Ako želite spremiti promjene, također možete upotrijebiti:

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

Tada će spremiti promjene.

90
12 дек. Odgovor je dan kiran boghra 12. prosinca. 2014-12-12 09:52 '14 u 9:52 AM 2014-12-12 09:52

Recimo da u tekstualnoj datoteci pod nazivom ~/commits-to-revert.txt imate sljedeće ~/commits-to-revert.txt (koristio sam git log --pretty=oneline )

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

Stvorite skriptu shell-a bash da biste vratili svaku od njih:

55
14 окт. odgovor je dao Lance Caraccioli 14. listopada. 2011-10-14 00:51 '11 u 0:51 2011-10-14 00:51

Dodatne alternative Jefromi Solutions

Jefromi rješenja su definitivno najbolja i svakako ih treba koristiti. Međutim, zbog cjelovitosti, htio sam pokazati i ova druga alternativna rješenja, koja se također mogu koristiti za vraćanje urezivanja (u smislu da kreirate novu predaju koja obrće promjene u prethodnom urezivanju, kao što git revert ).

Da budemo jasni, ove alternative nisu najbolji način da se vratite na urezivanje , Jefromi rješenja , ali samo želim ukazati na to da također možete koristiti ove druge metode kako biste postigli istu razinu kao git revert .

Alternativa 1: Ponovno postavljanje tvrdog i mekog

Je li to vrlo malo izmijenjena verzija rješenja Charlesa Baileyja za vraćanje SHA-hash-a na Git? :

53
29 июня '14 в 20:51 2014-06-29 20:51 odgovor je dao korisnik456814 29. lipnja '14 u 20:51 2014-06-29 20:51

Ovdje mi ništa nije pomoglo osim ove točne kombinacije:

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

Ključ je ovdje prisilno guranje, bez dodatnih poruka o popravljanju / popravljanju itd.

53
13 февр. odgovor je dan 13. veljače . 2018-02-13 01:40 '18 u 1:40 2018-02-13 01:40

Ovdje je mnogo jednostavniji način za povratak na prethodnu obvezu (i imati je u neupravljenom stanju, s njom učinite što god želite):

 git reset HEAD~1 

Dakle, nema potrebe popravljati identifikatore, itd. :)

50
29 февр. odgovor je dao Paul Walczewski 29. veljače. 2016-02-29 11:40 '16 u 11:40 2016-02-29 11:40

Ok, natrag na prethodni ulog u Git je prilično jednostavan ...

Vrati bez spremanja izmjena:

 git reset --hard <commit> 

Vratite se i spremite promjene:

 git reset --soft <commit> 

Objasnite da upotrebom git resetiranja možete resetirati na određeno stanje, obično s hashom urezivanja, kao što ste vidjeli gore.

Ali, kao što možete vidjeti, razlika je u korištenju dvije zastavice --soft i --hard , zadana je git reset upotrebom --soft zastavice, ali uvijek je preporučljivo koristiti ovu zastavu, objašnjavam svaku zastavu:


--soft

Zadana zastavica, kao što je objašnjeno, ne zahtijeva da bude osigurana, ne mijenja radno stablo, ali dodaje sve datoteke spremne za objavljivanje, tako da se vraćate u stanje predavanja, u kojem promjene datoteke postaju nepromijenjene.


--hard

Budite oprezni s ovom zastavom, ona resetira radno stablo i sve promjene u nadziranim datotekama nestaju!


Također sam stvorio sliku ispod koja se može dogoditi u stvarnom životu dok radim s git-om:

2019

Pod pretpostavkom da govorite o hostu iu odgovarajućoj grani (to sugerira da to može biti bilo koja poslovna grana za koju ste zabrinuti):

 # 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 

Našao sam odgovor iz posta na blogu Brisanje udaljenog Git repozitorija za određenu predaju .

45
10 мая '16 в 20:21 2016-05-10 20:21 odgovor dati markreyes 10. svibnja '16 u 20:21 2016-05-10 20:21

Nakon svih promjena, kada pritisnete sve ove naredbe, možda ćete morati upotrijebiti:

 git push -f ... 

I ne samo git push .

34
05 сент. odgovor je dao sivi 05 sep . 2013-09-05 17:03 '13 u 17:03 2013-09-05 17:03

Postoji naredba (nije dio Git kernela, ali je u paketu git-extras ) posebno za vraćanje i izvršavanje starih urezivanja:

 git back 

Na man stranici, ona se također može koristiti kao takva:

 # Remove the latest three commits git back 3 
32
08 авг. odgovor je dao Shadow Man 08 aug. 2013-08-08 21:30 '13 u 21:30 2013-08-08 21:30

Povratak na zadnju objavu i zanemarivanje svih lokalnih promjena:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 Odgovor je dao Mohammed Irfan Tirupattur 26. srpnja u 16:13 2016-07-26 16:13

Odaberite željeni držač i provjerite ga.

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

dok ne dobijete željenu fiksaciju. Da biste prisilili HEAD da pokaže ovo, učinite

 git reset --hard HEAD~1 

ili git reset --hard HEAD~2 ili nešto drugo.

26
26 февр. odgovor je dan tonythomas01 26. veljače. 2014-02-26 15:52 '14 u 15:52 2014-02-26 15:52

Ove početne korake možete dovršiti sami i vratiti se na git-repo.

  1. Izvucite najnoviju verziju vašeg spremišta iz Bitbucket pomoću naredbe git pull --all .

  2. Izvedite naredbu git log s -n 4 s vašeg terminala. Broj nakon -n određuje broj urezivanja u zapisniku, počevši s posljednjim urezivanjem u vašoj lokalnoj povijesti.

    $ git log -n 4

  3. Reset git reset --hard HEAD~N povijest vašeg spremišta pomoću git reset --hard HEAD~N gdje je N broj git reset --hard HEAD~N koje želite vratiti. U sljedećem primjeru, glava će biti postavljena na jednu obvezu, posljednju naredbu u povijesti spremišta:

  4. Kliknite na promjenu u git repo s git push --force - sile kako biste prisilili promjenu.

Ako želite da git repozitorij ima prethodnu predaju

 git pull --all git reset --hard HEAD~1 git push --force 
24
06 апр. Odgovor dao Nanhe Kumar 6. travnja 2017-04-06 15:20 '17 u 15:20 2017-04-06 15:20

Ovo je još jedna metoda izravnog resetiranja za nedavnu predaju.

 git stash git stash clear 

Izravno briše sve promjene koje ste napravili od posljednjeg urezivanja.

PS: On ima mali problem; briše i sve nedavno spremljene promjene predmemorije. Mislim da u većini slučajeva nije važno.

20
05 мая '16 в 14:43 2016-05-05 14:43 odgovor je dao Point Networks 05. svibnja '16 u 14:43 2016-05-05 14:43

Da bismo potpuno očistili direktorij kodera od nekih slučajnih promjena, koristili smo:

 git add -A . git reset --hard HEAD 

Samo git reset --hard HEAD se riješiti promjena, ali neće se riješiti "novih" datoteka. U njihovom slučaju, oni su slučajno povukli neku važnu mapu negdje slučajno, a sve te datoteke tretirane su kao nove s Git-om, tako da je reset --hard to nije popravio. Trčanje git add -A . unaprijed ih je sve eksplicitno pratio pomoću Gita, koji je uništen resetiranjem.

20
11 окт. Odgovor dao Chris Moschini 11. listopada 2015-10-11 03:10 '15 u 3:10 2015-10-11 03:10

Da biste spremili promjene iz prethodnog urezivanja u GLAVU i prešli na prethodnu predaju, izvršite:

 git reset <SHA> 

Ako nije potrebna nikakva promjena od prethodnog urezivanja do GLAVE i jednostavno odbacite sve promjene, slijedite ove korake:

 git reset --hard <SHA> 
20
28 июля '15 в 11:35 2015-07-28 11:35 odgovor je dao Vishnu Atrai 28. srpnja '15. u 11:35 sati 2015-07-28 11:35

Vjerujem da neki ljudi mogu doći na ovo pitanje, želeći znati kako je povratak napravio promjene koje su napravili u njihovom vlasniku - to jest, baciti sve i vratiti se na izvor / vlasnika, au ovom slučaju učinite sljedeće:

 git reset --hard origin/master 

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

19
05 февр. odgovor je dan nevster 05 feb . 2015-02-05 04:28 '15 u 4:28 2015-02-05 04:28

Vrati je naredba za izvršenje.

 git revert <commit1> <commit2> 

primjer:

git revert 2h3h23233

Može primiti raspon od glave kao što je prikazano ispod. Ovdje 1 kaže: "Vrati posljednji popravak."

git revert HEAD~1..HEAD

i onda napravi git push

16
20 авг. Sireesh Yarlagadda 20 aug. 2015-08-20 17:45 '15 u 17:45 2015-08-20 17:45

Vrati najnovije objave:

 git reset --hard HEAD 

HEAD je jednostavno referenca na trenutnu (posljednju) obvezu u trenutnoj niti. U svakom trenutku može biti samo jedna HEAD .

Vratite se na starije naredbe: najbrži način za vraćanje stare verzije jest upotreba naredbe za reset :

 # 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 

Ovime se grana HEAD vraća na navedenu verziju. Sve objave koje su se pojavile nakon ove verzije zapravo su otkazane; Vaš je projekt potpuno isti kao u tom trenutku.

Naredba reset ima nekoliko opcija, a jedna od najzanimljivijih je zastavica --soft . Ako ga koristite umjesto --hard , Git će sve promjene u tim "poništenim" spremiti kao lokalne promjene.

Vraćanje verzije u novu lokalnu podružnicu

Kao što je rečeno, korištenje naredbe reset na vašoj HEAD grani je prilično radikalna akcija: ona će ukloniti sve naredbe (u ovoj grani) koje su se pojavile nakon određene revizije. Ako ste sigurni da je to ono što želite, sve je u redu.

Međutim, postoji i sigurniji način ako ostavite trenutnu granu HEAD netaknutom. Budući da su "grane" tako jeftine i jednostavne u Git-u, lako možemo stvoriti novu granu koja počinje s ovom starom verzijom:

 git checkout -b old-project-state 0ad5a7a6 

Obično se naredba checkout koristi za jednostavno prebacivanje grana. Međutim, ako ste dali opciju -b, možete stvoriti i novu granu (u ovom primjeru, staro stanje projekta). Ako ne želite da započne s trenutnom revizijom HEAD-a, također trebate pružiti popravak raspršivanja - staru reviziju projekta koji želimo vratiti.

Sada imate novu granu nazvanu staro-projektno-stanje, koja odražava staru verziju vašeg projekta - bez dodirivanja ili čak brisanja bilo kakvih drugih obveza ili grana.

14
31 авг. odgovor dati Lyes CHIOUKH 31 kolovoz. 2018-08-31 14:08 '18 u 14:08 sati 2018-08-31 14:08

Ako je situacija hitna i samo želite učiniti ono što je upitnik postavio na brz i prljav način, pod pretpostavkom da je vaš projekt u direktoriju "moj projekt":

  1. Kopirajte cijeli direktorij i nazovite ga nečim drugim, na primjer, "moj je projekt kopija."

  2. učiniti:

     git reset --hard [first-4-letters>