Kako mogu poništiti nedavne obveze u git-u?

Slučajno sam poslao pogrešne datoteke u Git , ali još nisam poslao predaju poslužitelju.

Kako mogu poništiti ove naredbe iz lokalnog spremišta?

18.990
29 мая '09 в 21:09 2009-05-29 21:09 Hamza Yerlikaya pitao 29 May '09 u 21:09 2009-05-29 21:09
@ 92 odgovora

Poništi i ponovi

20501
29 мая '09 в 21:13 2009-05-29 21:13 odgovor od Esko Luontola 29. svibnja u 21:13 2009-05-29 21:13

Otkazivanje objave je pomalo zastrašujuće ako ne znate kako funkcionira. Ali to je zapravo iznenađujuće lako, ako razumijete.

Recimo da ga imate, gdje je C vaša HEAD, i (F) je stanje vaših datoteka.

  (F) ABC ↑ master 

Želite resetirati zadatak C i nikad ga više nećete vidjeti . To učinite:

 git reset --hard HEAD~1 

rezultat:

  (F) AB ↑ master 

Sada B - GLAVA. Budući da ste koristili --hard , vaše se datoteke vraćaju u stanje kada --hard B.

Ah, ali pretpostavimo da je počiniti C nije katastrofa, ali prilično malo. Želite poništiti predaju, ali spremite promjene za malu izmjenu prije donošenja najboljeg urezivanja. Ponovno započinjemo s C-om kao glavom:

  (F) ABC ↑ master 

To možete učiniti tako da --hard -

border=0
 git reset HEAD~1 

U tom slučaju, rezultat je:

  (F) ABC ↑ master 

U oba slučaja, HEAD je samo pokazivač na zadnje urezivanje. Kada napravite git reset HEAD~1 , javite Git-u da pomakne HEAD pokazivač natrag jednu obvezu. Ali (osim ako koristite --hard ) svoje datoteke ostavljate --hard kakve jesu. Sada git status pokazuje promjene koje ste registrirali u C. Niste ništa izgubili!

Za lagani dodir možete čak i otkazati predaju, ali ostavite datoteke i indeksirajte :

 git reset --soft HEAD~1 

Ovo ne samo da ostavlja vaše datoteke samima, već čak i ostavlja indeks samo. Kada napravite git status , vidjet ćete da indeks sadrži iste datoteke kao i prije. Zapravo, odmah nakon ove naredbe, možete izvršiti git commit i git commit ćete istu predaju koju ste upravo imali.

Još jedna stvar: pretpostavimo da ste uništili čin , kao u prvom primjeru, ali onda ste otkrili da vam je na kraju potrebno ? Nema sreće, zar ne?

Ne, još uvijek postoji način da se to vrati. Utipkajte git reflog i vidjet ćete popis (djelomično) izvršenja ShAS-a (tj. Hašiš ) koji ste premjestili da biste pronašli urezani urez i učinili to.:

 git checkout -b someNewBranchName shaYouDestroyed 

Sada ste uskrsnuli ovu predaju. Odbori zapravo nisu uništeni u Gitu oko 90 dana, tako da se obično možete vratiti i spasiti onu koju se niste htjeli riješiti.

10.099
29 июля '11 в 1:22 2011-07-29 01:22 odgovor je dao Ryan Lundy 29. srpnja '11 u 1:22 2011-07-29 01:22

Trebalo mi je malo vremena da shvatim, pa će možda ovo pomoći nekome ...

Dva su načina "poništavanja" zadnje objave, ovisno o tome jeste li napravili javno izvješće (kliknuto na udaljeno spremište):

Kako otkazati lokalnu predaju

Neka se kaže da sam to napravio lokalno, ali sada želim ukloniti tu fiksaciju.

 git log commit 101: bad commit # latest commit, this would be called 'HEAD' commit 100: good commit # second to last commit, this is the one we want 

Da bi vratili sve prije nego što je bilo prije zadnjeg urezivanja, potrebno je izvršiti reset prije nego se HEAD izvršavati prije HEAD :

 git reset --soft HEAD^ # use --soft if you want to keep your changes git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made 

Sada će git log pokazati da je zadnja objava uklonjena.

Kako otkazati javno rješenje

Ako ste već učinili da vaše urezivanje bude javno dostupno, morat ćete stvoriti novu predaju koja "vraća" promjene koje ste napravili u prethodnom urezivanju (trenutnoj HEAD).

 git revert HEAD 

Sada će vaše izmjene biti poništene i spremne za objavljivanje:

 git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need 

Za više informacija pogledajte Git Basics - Otkaži stvari.

1889
16 июня '11 в 20:27 2011-06-16 20:27 odgovor je dao Andrew 16. lipnja 2011. u 20:27 2011-06-16 20:27

Dodajte / uklonite datoteke da biste dobili ono što želite:

 git rm classdir git add sourcedir 

Zatim promijenite urezivanje:

 git commit --amend 

Prethodna, pogrešna ispravka bit će uređena kako bi odražavala novo stanje indeksa - drugim riječima, izgledalo bi kao da nikada niste pogriješili.

Napominjemo da to trebate učiniti samo ako još niste kliknuli. Ako ste kliknuli, morate se obvezati da ćete to ispraviti.

1664
29 мая '09 в 21:16 2009-05-29 21:16 odgovor je dan bdonlan 29. svibanj '09 u 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 Lennart Koopmann je odgovorio 29. svibnja u 21:13 2009-05-29 21:13

Za promjenu zadnjeg urezivanja

Zamijenite datoteke u indeksu:

 git rm --cached *.class git add *.java 

Zatim, ako je privatna grana, promijenite urezivanje:

 git commit --amend 

Ili, ako je to dijeljena grana, izvedite novu predaju:

 git commit -m 'Replace .class files with .java files' 


( za promjenu prethodnog urezivanja upotrijebite nevjerojatnu interaktivnu rebasu )


ProTip ™: dodajte *.class za gitignore da biste zaustavili ovo ponavljanje.


Za vraćanje popravka

Promjena urezivanja idealno je rješenje ako trebate promijeniti zadnje urezivanje, ali reset općenitije rješenje.

Možete resetirati git na bilo koje učvršćenje pomoću:

 git reset @~N 

Gdje je N broj urezivanja prije HEAD , a @~ vraća na prethodnu predaju.

Dakle, umjesto da unosite izmjene u urezivanje, možete koristiti

 git reset @~ git add *.java git commit -m "Add .java files" 

Provjerite da li git help reset , posebno, --soft --mixed i --hard kako bi bolje razumjeli što radi.

Reflog

Ako se zabrljate, uvijek možete upotrijebiti reflog za pronalaženje daljinskih objava:

 $ git reset @~ $ git reflog c4f708b HEAD@{0}: reset: moving to @~ 2c52489 HEAD@{1}: commit: added some .class files $ git reset 2c52489 ... and you're back where you started 


707
31 июля '10 в 12:39 2010-07-31 12:39 odgovor je dat Zaz 31. srpnja '10 u 12:39 2010-07-31 12:39

Upotrijebite git revert <commit-id>

Da biste dobili ID popravka, koristite git log

589
25 мая '12 в 19:04 2012-05-25 19:04 odgovor je dao Jaco Pretorius 25. svibnja '12 u 19:04 2012-05-25 19:04

Ako planirate otkazati lokalnu predaju u potpunosti, bez obzira što promijenite, napravili ste urezivanje, a ako se ne brinete o tome, samo pokrenite sljedeću naredbu.

 git reset --hard HEAD^1 

(Ova naredba će zanemariti sve vaše obveze i vaše će promjene biti potpuno izgubljene od vašeg lokalnog radnog stabla). Ako želite otkazati predaju, ali želite izvršiti promjene u području staginga (prije nego izvršite, kao i nakon git add ), pokrenite sljedeću naredbu.

 git reset --soft HEAD^1 

Sada su vaše fiksne datoteke u području skretanja. Pretpostavimo da ako želite premašiti datoteke, jer trebate urediti netočan sadržaj, pokrenite sljedeću naredbu

 git reset HEAD 

Sada prenesene datoteke dolaze iz faznog područja u neisporučeno područje. Sada su datoteke spremne za uređivanje, tako da što god promijenite, želite ići na uređivanje i dodavanje i stvaranje novog / novog urezivanja.

veći

472
31 янв. odgovor je dat Madhan Ayyasamy 31. siječnja 2013-01-31 10:06 '13 u 10:06 2013-01-31 10:06

Ako imate instaliran Git Extras , možete pokrenuti git undo da biste poništili posljednje urezivanje. git undo 3 poništava posljednja 3 urezivanja.

451
13 дек. odgovor je dan 13 dec. 2011-12-13 13:18 '11 u 13:18 2011-12-13 13:18

Htio sam otkazati zadnjih 5 izvršenja u našem zajedničkom spremištu. Pogledao sam reviziju na koju sam se htio vratiti. Zatim sam napisao sljedeće.

 prompt> git reset --hard 5a7404742c85 HEAD is now at 5a74047 Added one more page to catalogue prompt> git push origin master --force Total 0 (delta 0), reused 0 (delta 0) remote: bb/acl: neoneye is allowed. accepted payload. To git@bitbucket.org:thecompany/prometheus.git + 09a6480...5a74047 master -> master (forced update) prompt> 
419
06 апр. odgovor je dat neoneye 06 apr. 2012-04-06 16:58 '12 u 4:58 pm 2012-04-06 16:58

Radije koristim git rebase -i za ovaj zadatak, jer postoji dobar popis na kojem mogu birati da se riješi. Možda nije tako jednostavno kao i neki drugi odgovori, ali izgleda da je to točno.

Odaberite broj urezivanja koje želite navesti, a zatim ih pozovite (da biste pokupili posljednja tri)

 git rebase -i HEAD~3 

Popis uzoraka

 pick aa28ba7 Sanity check for RtmpSrv port pick c26c541 RtmpSrv version option pick 58d6909 Better URL decoding support 

Git će zatim ukloniti predaju za bilo koji redak koji se želi izbrisati.

397
25 окт. Odgovor dao Steven Penny 25. listopada 2012-10-25 06:41 '12 u 6:41 am 2012-10-25 06:41

Kako popraviti prethodnu lokalnu obvezu

Upotrijebite git-gui (ili ekvivalent) da biste izvršili git commit --amend . Iz grafičkog korisničkog sučelja možete dodati ili ukloniti pojedinačne datoteke iz urezivanja. Također možete promijeniti poruku urezivanja.

Kako otkazati prethodnu lokalnu obvezu

Jednostavno vratite granu na prethodno mjesto (na primjer, koristeći gitk ili git rebase ). Zatim ponovno primijenite promjene iz spremljene kopije. Nakon što je sakupljanje smeća u vašem lokalnom spremištu slično činjenici da se neželjena prijava nije dogodila. Za sve to u jednoj naredbi koristite git reset HEAD~1 .

Upozorenje : nemarno korištenje git reset dobar je način da zbunite vašu radnu kopiju. Preporučujem Git-ovcima da izbjegnu ovo ako mogu.

Kako otkazati javnu predaju

Obrnite odabirom češnja ( git-revert ) da biste odbacili promjene.

Ako još niste napravili druge izmjene u svojoj niti, jednostavno možete napraviti ...

 git revert --no-edit HEAD 

Zatim pošaljite ažuriranu granu u zajedničko spremište.

Povijest izdavanja prikazat će zasebno oboje.


Izborno: popravite privatnu podružnicu u javnom repozitoriju

To može biti opasno - provjerite imate li lokalnu kopiju podružnice.

Također imajte na umu: ne želite to učiniti ako netko drugi radi na grani.

 git push --delete (branch_name) ## remove public version of branch 

Očistite svoju granu lokalno, a zatim se isključite ...

 git push origin (branch_name) 

U normalnom slučaju, vjerojatno ne morate brinuti da će vaša povijest izdavanja u privatnoj grani biti netaknuta. Samo pritisnite sljedeću naredbu (vidi “Kako otkazati javnu obvezu” gore), a zatim napravite spajanje squasha da biste sakrili priču.

382
23 апр. odgovor je dan nobar 23 Apr 2013-04-23 20:27 '13 u 20:27 2013-04-23 20:27

Ako ste pogriješili, ali niste kliknuli,

 git reset --soft HEAD~1 

GLAVA ~ 1 je kratka za pričvršćivanje ispred glave. Alternativno, možete uputiti na SHA-1 hash ako ga želite resetirati. --soft će ukloniti urezivanje, ali će ostaviti sve vaše izmijenjene datoteke "Promjene će biti napravljene", kao što bi Git status rekao.

Ako se želite riješiti bilo kakvih promjena u nadziranim datotekama u radnom stablu, od urezivanja prije nego glas koristi " --hard ".

ILI

Ako ste već kliknuli i netko povukao, što je obično moja stvar, ne možete koristiti Git reset. Međutim, možete učiniti git vraćanje,

 git revert HEAD 

To će stvoriti novi popravak, koji poništava sve što je uneseno slučajnim popravkom.

307
03 сент. odgovor je dan santos_mgr 03 sep . 2014-09-03 10:15 '14 u 10:15 sati 2014-09-03 10:15

Ako ga želite trajno otkazati, a klonirali ste neko spremište

ID popravka može se vidjeti.

 git log 

Tada možete učiniti -

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 odgovor je dao slabi 17. svibnja '13 u 4:02 2013-05-17 16:02

U programu SourceTree (GUI za GitHub) možete desnom tipkom miša kliknuti predaju i izvršiti Reverse Fix. To bi trebalo poništiti promjene.

Na terminalu:

Također možete koristiti:

 git revert 

ili:

256
28 июня '13 в 13:18 2013-06-28 13:18 odgovor je dao Varun Parakh 28. lipnja 2013. u 13:18 2013-06-28 13:18

Jedan tim:

241
05 марта '14 в 16:55 2014-03-05 16:55 odgovor je dao Manish Shrivastava 05. ožujka 2014. u 16:55 2014-03-05 16:55

Samo ga resetirajte pokretanjem naredbe ispod pomoću git :

 git reset --soft HEAD~1 

Objasnite da je ono što git reset osnovi reset na bilo koji uređaj na koji se želite vratiti, a ako ga spojite s --soft , vratit će se, ali spremiti promjene u vaše datoteke, pa ćete se vratiti na scenu Dodana je datoteka, HEAD je glava grane, a ako kombinirate s ~1 (u ovom slučaju također koristite HEAD^ ), vratit će se samo na jednu naredbu koju želite ...

Koristim korake na slici ispod za vas detaljnije, uključujući sve korake koji se mogu dogoditi u stvarnim situacijama i izvršavanje koda:

2019

Kako otkazati posljednji git?

Da bi vratili sve prije nego što je bilo prije zadnjeg urezivanja, moramo resetirati popravak na HEAD.

  1. Ako ne želite spremiti izmjene:

     git reset --hard HEAD^ 
  2. Ako želite spremiti promjene:

     git reset --soft HEAD^ 

Sada provjerite svoj git dnevnik. Pokazat će da je posljednji popravak uklonjen.

214
23 апр. odgovor je dan Ranjithkumar Ravi 23. travnja 2014-04-23 14:21 '14 u 14:21 2014-04-23 14:21

Koristite reflog da biste pronašli ispravno stanje.

 git reflog 

2019

172
07 янв. odgovor dao Shubham Chaudhary 07. \ t 2014-01-07 01:34 '14 u 1:34 2014-01-07 01:34

"Resetiranje radnog stabla prije zadnjeg urezivanja"

 git reset --hard HEAD^ 

"Obriši nepoznate datoteke s radnog stabla"

 git clean 

pogledajte - Git brza referenca

NAPOMENA. Ova naredba će ukloniti prethodnu predaju, stoga je koristite s oprezom! git reset --hard -

167
03 окт. dan odgovor Ravi_Parmar Oct 03. 2013-10-03 15:43 '13 u 15:43 2013-10-03 15:43

Prva vožnja:

 git reflog 

Pokazat će vam sve moguće radnje koje ste izvršili u vašem spremištu, na primjer, urezivanje, spajanje, povlačenje itd.

Onda učinite:

 git reset --hard ActionIdFromRefLog 
150
11 окт. odgovor je dao U. Ali 11. listopada. 2013-10-11 17:41 '13 u 17:41 2013-10-11 17:41

Poništi posljednju predaju:

git reset --soft HEAD^ ili git reset --soft HEAD~

To će poništiti posljednje predavanje.

Ovdje --soft znači poništavanje postavki.

HEAD~ ili HEAD^ znači otići do urezivanja prije HEAD.


Zamijenite posljednju naredbu novom:

 git commit --amend -m "message" 

On će zamijeniti posljednju naredbu novim popravljačem.

141
06 марта '16 в 14:53 2016-03-06 14:53 odgovor je dat akshay_rahar 06. ožujka u 14:53 2016-03-06 14:53

Drugi način:

Napravite zahtjev za granu koju želite vratiti, a zatim vratite lokalnu radnu kopiju natrag u urezivanje koje želite biti posljednje na udaljenom poslužitelju (sve nakon njegovog odlaska). Da biste to učinili, desnom tipkom miša kliknuli ste u programu SourceTree i odabrali "Vrati BRANCHNAME na ovu obvezu".

Zatim idite u lokalni direktorij spremišta i pokrenite sljedeću naredbu:

 git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Ovo će obrisati sve objave nakon trenutne u lokalnom spremištu, ali samo za jednu granu.

136
13 мая '13 в 20:12 2013-05-13 20:12 odgovor je dat CommaToast 13. svibnja '13 u 20:12 2013-05-13 20:12

Unesite git log i pronađite najnoviju šifru i unesite:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 odgovor je dao korisnik853293 15. svibnja '13 u 16:12 2013-05-15 16:12

U mom slučaju, slučajno sam napravio neke datoteke koje nisam htio. Tako sam učinio sljedeće, i to je uspjelo:

 git reset --soft HEAD^ git rm --cached [files you do not need] git add [files you need] git commit -c ORIG_HEAD 

Provjerite rezultate pomoću gitk ili git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 odgovor je dao egridasov 18. srpnja '13 u 9:41 2013-07-18 09:41

Upotrijebite SourceTree (grafički alat za Git) da biste vidjeli vaše stavke i stablo. Možete ga ručno resetirati klikom desnom tipkom miša.

113
29 авг. Odgovor je dat iOS Coder 29 aug. 2013-08-29 19:18 '13 u 19:18 2013-08-29 19:18

Da biste se vratili na prethodnu reviziju, trajno izbrišite sve nedodijeljene promjene:

 git reset --hard HEAD~1 
111
28 авг. odgovor je dao thestar 28 aug. 2014-08-28 19:03 '14 u 19:03 2014-08-28 19:03

Postoje dva glavna scenarija.

Niste pritisnuli urezivanje

Ako je problem povezan s dodatnim datotekama koje ste obvezali (a ne želite ih koristiti u spremištu), možete ih izbrisati s git rm a zatim - --amend s --amend

 git rm <pathToFile> 

Također možete izbrisati cijele direktorije s -r ili čak spojiti s drugim bash naredbama.

 git rm -r <pathToDirectory> git rm $(find -name '*.class') 

Nakon brisanja datoteka, možete izvršiti obvezu pomoću opcije --amend

 git commit --amend -C HEAD # the -C option is to use the same commit message 

To će vam omogućiti da ponovno napišete nedavnu lokalnu predaju, uklanjajući nepotrebne datoteke, tako da te datoteke nikada neće biti poslane na guranje, a također će biti izbrisane iz vašeg lokalnog .git spremišta putem GC-a.

Već ste kliknuli obvezu

Isto rješenje možete primijeniti na drugu skriptu, a zatim pokrenuti git push s opcijom -f na -f , ali to se ne preporuča jer prepisuje izbrisanu povijest divergentnom promjenom (to može oštetiti vaše spremište).

Umjesto toga, morate se obvezati bez --amend (zapamtite ovu izmjenu): ova opcija prepisuje povijest zadnjeg urezivanja).

111
12 сент. odgovor je dseminara 12 sep . 2014-09-12 17:51 '14 u 17:51 2014-09-12 17:51

Za lokalno fiksiranje

 git reset --soft HEAD~1 

ili ako se ne sjećate točno koja je fiksacija moguća, možete upotrijebiti

 git rm --cached <file> 

Za pritisnut

Ispravan način za uklanjanje datoteka iz povijesti spremišta je korištenje git filter-branch . To jest,

rubrici git-filter-branch (1) . 

111
ответ дан geoom 04 марта '14 в 7:35 2014-03-04 07:35