Kaip atšaukti paskutinius įsipareigojimus git?

Aš netyčia išsiųčiau neteisingus failus į „ Git“ , bet aš dar nesiunčiau įsipareigojimo serveriui.

Kaip galiu atšaukti šiuos įsipareigojimus iš vietos saugyklos?

18990
29 мая '09 в 21:09 2009-05-29 21:09 Hamza Yerlikaya paklausė 29 gegužės 09 d. 21:09 2009-05-29 21:09
@ 92 atsakymai

Atšaukti ir pakartoti

20501
29 мая '09 в 21:13 2009-05-29 21:13 atsakymas, kurį pateikė Esko Luontola, gegužės 29 d., 09:21, 2009-05-29 21:13

Atšaukti įsipareigojimą yra šiek tiek baisu, jei nežinote, kaip tai veikia. Bet tai tikrai stebina, jei suprantate.

Tarkime, jūs turite tai, kur C yra jūsų HEAD, ir (F) yra jūsų failų būsena.

  (F) ABC ↑ master 

Jūs norite atstatyti C ir niekada nematyti . Jūs tai darote:

 git reset --hard HEAD~1 

Rezultatas:

  (F) AB ↑ master 

Dabar B - HEAD. Kadangi naudojote --hard , jūsų failai grįžta į savo būseną, kai jūs --hard B.

Ak, bet tarkime, kad įsipareigojimas C nėra nelaimė, bet gana mažai. Norite atšaukti įsipareigojimą, bet išsaugokite pakeitimus , kad juos atliktumėte nedideliam redagavimui. Dar kartą pradedant čia, C kaip galvą:

  (F) ABC ↑ master 

Tai galite padaryti palikdami --hard :

border=0
 git reset HEAD~1 

Šiuo atveju rezultatas yra:

  (F) ABC ↑ master 

Abiem atvejais HEAD yra tik po paskutinio įvykio rodyklė. Kai atliekate git reset HEAD~1 , pasakykite Git, kad galėtumėte perkelti HEAD žymeklį atgal. Bet (jei nenaudojate --hard ), paliekate savo failus taip, kaip jie buvo. Dabar „ git status rodo pakeitimus, kuriuos užregistravote „C.“.

Jei norite šiek tiek paliesti, galite net atšaukti įsipareigojimą, bet palikti savo failus ir indeksą :

 git reset --soft HEAD~1 

Tai ne tik palieka jūsų failus, bet ir palieka jūsų indeksą. Kai atliksite git status , pamatysite, kad indeksas turi tuos pačius failus kaip ir anksčiau. Tiesą sakant, iškart po šios komandos galėsite įvykdyti git commit ir jūs iš naujo atliksite tą patį įsipareigojimą, kurį ką tik turėjote.

Dar vienas dalykas: tarkime, kad jūs sunaikinote įsipareigojimą, kaip ir pirmame pavyzdyje, bet tada jūs sužinojote, kad jums to reikia galų gale ? Ne sėkmės, tiesa?

Ne, vis dar yra būdas jį grąžinti. Įveskite „ git reflog ir pamatysite (iš dalies) „ ShAS“ (t. Y. „Maišos“) sąrašą, kurį perkėlėte, kad surastumėte sugadintą, ir atlikite:

 git checkout -b someNewBranchName shaYouDestroyed 

Dabar jūs prisikėlėte šį įvykį. Komitetai iš tikrųjų nėra sunaikinti „Git“ apie 90 dienų, todėl paprastai galite grįžti ir išgelbėti vieną, kurio nenorėjote atsikratyti.

10099
29 июля '11 в 1:22 2011-07-29 01:22 atsakymą pateikė Ryan Lundy, liepos 29 d. 11, 1:22 2011-07-29 01:22

Man teko šiek tiek laiko suprasti, todėl gal tai padės kas nors ...

Yra du būdai, kaip „atšaukti“ paskutinį įsipareigojimą, priklausomai nuo to, ar padarėte viešą ataskaitą (paspaudėte nuotolinėje saugykloje):

Kaip atšaukti vietinį įsipareigojimą

Leiskite pasakyti, kad tai padariau vietoje, bet dabar noriu pašalinti šią fiksaciją.

 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 

Norint atkurti viską prieš tai, kai jis buvo įvykdytas iki paskutinio įsipareigojimo, prieš atlikdami HEAD reikia atlikti iš reset :

 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 

Dabar „ git log parodys, kad mūsų paskutinis įvykis buvo pašalintas.

Kaip atšaukti viešą fiksavimą

Jei jau padarėte savo įsipareigojimus viešai, turėsite sukurti naują įsipareigojimą, kuris „grąžina“ ankstesnio įsipareigojimo (dabartinio HEAD) atliktus pakeitimus.

 git revert HEAD 

Dabar pakeitimai bus atšaukti ir pasiruošę būti įvykdyti:

 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 

Norėdami gauti daugiau informacijos, patikrinkite „ Git Basics“ - „Cancel Things“.

1889 m
16 июня '11 в 20:27 2011-06-16 20:27 atsakymą Andriejus pateikė birželio 16 d. 11 val. 20:27 2011-06-16 20:27

Pridėti / pašalinti failus, kad gautumėte tai, ko norite:

 git rm classdir git add sourcedir 

Tada pakeiskite įsipareigojimą:

 git commit --amend 

Ankstesnis klaidingas pataisymas bus redaguojamas, kad atspindėtų naują indekso būseną - kitaip tariant, jis atrodys, kad niekada nepadarėte klaidos.

Atkreipkite dėmesį, kad tai turėtumėte atlikti tik tuo atveju, jei dar nepaspaudėte. Jei spustelėjote, jūs tiesiog turite įsipareigoti jį pataisyti.

1664
29 мая '09 в 21:16 2009-05-29 21:16 atsakymas pateikiamas bdonlan gegužės 29 d., „09, 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 Lennartas Koopmannas atsakė gegužės 29 d. 09:21 val. 2009-05-29 21:13

Norėdami pakeisti paskutinį įvykį

Pakeisti indekso failus:

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

Tada, jei tai yra privatus filialas, pakeiskite įsipareigojimą:

 git commit --amend 

Arba, jei tai yra bendras filialas, atlikite naują įsipareigojimą:

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


(jei norite pakeisti ankstesnį įvykį , naudokite nuostabią interaktyvią versiją )


ProTip ™: pridėti *.class į gitignore, kad sustabdytumėte šį pakartojimą.


Norėdami grąžinti pataisą

Pakeitus įsipareigojimą, tai idealus sprendimas, jei reikia pakeisti paskutinį įvykį, bet reset bendresnis sprendimas.

Git galite iš naujo nustatyti į bet kurį įrenginį naudodami:

 git reset @~N 

Kur N yra įsipareigojimų skaičius prieš HEAD ir @~ grįžta į ankstesnį įvykį.

Taigi vietoj to, kad padarytumėte pakeitimų, galite naudoti:

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

Patikrinkite, ar „ git help reset --mixed ir „ --hard kad geriau suprastumėte, ką jis daro.

Atnaujinimas

Jei atsijungsite, visada galite naudoti „reflog“, kad surastumėte nuotolinius įsipareigojimus:

 $ 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 atsakymas pateikiamas Zazo liepos 10 d., 12:39, 2010-07-31 12:39

Naudokite git revert <commit-id>

Jei norite gauti pataisos ID, naudokite git log

589
25 мая '12 в 19:04 2012-05-25 19:04 atsakymą pateikė Jaco Pretorius gegužės 25 d., 12 val. 19:04 2012-05-25 19:04

Jei planuojate visiškai atšaukti vietinį įsipareigojimą, nesvarbu, ką pakeisite, padarėte įsipareigojimą ir, jei nesijaudinate, tiesiog atlikite šią komandą.

 git reset --hard HEAD^1 

(Ši komanda ignoruos visus jūsų įsipareigojimus ir jūsų pakeitimai bus visiškai prarasti iš jūsų vietos darbo medžio). Jei norite atšaukti įsipareigojimą, bet norite atlikti tarpinės srities pakeitimus (prieš padarydami, kaip ir po git add ), atlikite šią komandą.

 git reset --soft HEAD^1 

Dabar jūsų fiksuoti failai yra sustojimo zonoje. Tarkime, kad jei norite viršyti failus, nes reikia redaguoti neteisingą turinį, atlikite šią komandą

 git reset HEAD 

Dabar perduoti failai yra iš fazinės srities į nepristatytą sritį. Dabar failai yra paruošti redaguoti, todėl, nesvarbu, ką jūs keičiate, norite eiti redaguoti ir pridėti ir sukurti naują / naują įsipareigojimą.

Daugiau

472
31 янв. atsakymas duotas Madhan Ayyasamy sausio 31 d 2013-01-31 10:06 '13, 10:06, 2013-01-31 10:06

Jei įdiegėte „ Git Extras“ , galite paleisti „ git undo kad būtų atšauktas paskutinis įvykis. git undo 3 atšaukia paskutinius 3 įsipareigojimus.

451
13 дек. atsakymas pateikiamas nickf 13 dec. 2011-12-13 13:18 '11, 13:18, 2011-12-13 13:18

Norėjau atšaukti paskutinius 5 įsipareigojimus mūsų bendroje saugykloje. Pažvelgiau į pakeitimo id, kurį norėjau grįžti. Tada aš įvedžiau šiuos duomenis.

 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 апр. atsakymas pateikiamas neoneye 06 balandžio. 2012-04-06 16:58 '12, 16:58 pm 2012-04-06 16:58

Norėčiau naudoti šią užduotį „ git rebase -i “, nes yra geras sąrašas, kuriame galiu pasirinkti įsipareigoti atsikratyti. Tai gali būti ne taip paprasta, kaip ir kiti čia pateikti atsakymai, bet tai tiesiog atrodo teisinga.

Pasirinkite norimų įrašų skaičių, tada skambinkite (norėdami pasiimti paskutinius tris)

 git rebase -i HEAD~3 

Pavyzdžių sąrašas

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

Tada „Git“ pašalins bet kurios eilutės, kurią norite ištrinti, įsipareigojimą.

397
25 окт. Steven Penny atsakymas spalio 25 d 2012-10-25 06:41 '12 6:41 am 2012-10-25 06:41

Kaip nustatyti ankstesnius vietinius įsipareigojimus

Naudokite „git-gui“ (arba lygiavertį), kad atliktumėte „ git commit --amend . GUI galite pridėti arba pašalinti atskirus failus iš įsipareigojimo. Taip pat galite pakeisti įsipareigojimo pranešimą.

Kaip atšaukti ankstesnius vietinius įsipareigojimus

Tiesiog grąžinkite savo filialą į ankstesnę vietą (pvz., Naudodami gitk arba git rebase ). Tada pakartotinai pritaikykite pakeitimus iš išsaugotos kopijos. Po šiukšlių surinkimo vietinėje saugykloje bus panašus į tai, kad nepageidaujamas įsipareigojimas niekada nebuvo įvykdytas. Norėdami tai padaryti vienoje komandoje, naudokite git reset HEAD~1 .

Įspėjamojo žodžio žodis : neatsargus git reset yra geras būdas supainioti savo darbo kopiją. Aš rekomenduoju Git naujokams tai išvengti, jei jie gali.

Kaip atšaukti viešą įsipareigojimą

Jei norite atmesti pakeitimus, atvirkščiai pasirinkite vyšną ( git-revert ).

Jei dar nepadarėte kitų siūlų pakeitimų, galite tiesiog ...

 git revert --no-edit HEAD 

Tada išsiųskite atnaujintą filialą į bendrą saugyklą.

Įsipareigojimo istorija bus rodoma atskirai.


Neprivaloma: nustatykite privatų filialą viešojoje saugykloje

Tai gali būti pavojinga - įsitikinkite, kad turite vietinę filialo kopiją.

Taip pat atkreipkite dėmesį: nenorite to daryti, jei filialas dirba kitam.

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

Išvalykite savo filialą vietoje, tada išjunkite ...

 git push origin (branch_name) 

Įprastu atveju jums tikriausiai nereikės nerimauti, kad jūsų įsipareigojimo istorija privačiame filiale bus nepaliesta. Tiesiog paspaudus vėlesnį įvykį (žr. „Kaip atšaukti viešą įsipareigojimą“), tada skvošas sujungia, kad paslėptų istoriją.

382
23 апр. atsakymas pateikiamas nobar 23 Bal 2013-04-23 20:27 '13, 20:27, 2013-04-23 20:27

Jei padarėte klaidą, bet nepaspaudėte,

 git reset --soft HEAD~1 

HEAD ~ 1 yra trumpas tvirtinimui prie galvos. Taip pat galite kreiptis į SHA-1 maišą, jei norite jį iš naujo nustatyti. --soft pašalins įsipareigojimą, tačiau jis paliks visus jūsų pakeistus failus "Pakeitimai bus padaryti", kaip sako git statusas.

Jei norite atsikratyti bet kokių stebimų failų pakeitimų darbo medyje, kaip įrašą prieš balsą naudoja „ --hard “.

Or

Jei jau spustelėjote ir kažkas ištraukė, o tai paprastai yra mano verslas, negalite naudoti git reset. Tačiau galite atlikti git grįžimą,

 git revert HEAD 

Tai sukurs naują pataisą, kuri panaikina viską, kurią įvedė atsitiktinis nustatymas.

307
03 сент. atsakymas pateikiamas santos_mgr 03 sep . 2014-09-03 10:15 '14, 10:15 val. 2014-09-03 10:15

Jei norite jį visam laikui atšaukti, ir jūs klonavote kai kurią saugyklą

Nustatomas ID.

 git log 

Tada galite padaryti -

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 atsakymą pristato prastas , gegužės 17 d., 13 d., 4:02 2013-05-17 16:02

SourceTree“ („GitHub“ GUI) galite dešiniuoju pelės klavišu spustelėti įvykdymą ir vykdyti „Reverse Fix“. Tai turėtų atšaukti jūsų pakeitimus.

Terminale:

Taip pat galite naudoti:

 git revert 

Arba:

256
28 июня '13 в 13:18 2013-06-28 13:18 Atsakymą pateikė Varun Parach , birželio 28 d. 13 val. 13:18 2013-06-28 13:18

Viena komanda:

241
05 марта '14 в 16:55 2014-03-05 16:55 atsakymą pateikė „ Manish Shrivastava “ kovo 5 d. 14 d. 16:55 2014-03-05 16:55

Tiesiog iš naujo nustatykite šią komandą naudodami git :

 git reset --soft HEAD~1 

Paaiškinkite, kad tai, ką git reset atlieka, iš esmės yra atkuriama į bet kurį --soft kurį norite grįžti, tada, jei jį sujungsite su --soft , jis sugrįš, bet išsaugos jūsų failų pakeitimus, todėl grįšite į sceną, kur pridėtas failas, HEAD yra filialo vadovas, o jei derinate su ~1 (šiuo atveju taip pat naudojate HEAD^ ), jis grįš tik į vieną komandą, kurią norite ...

Toliau pateikiamame paveiksle išsamiau aprašau jūsų veiksmus, įskaitant visus veiksmus, kurie gali įvykti realiose situacijose ir kodo vykdymą:

2019

21 июня '17 в 12:33 2017-06-21 12:33 atsakymą Alireza pateikė birželio 21 d. 17 val. 12:33 2017-06-06 12:33

Kaip atšaukti paskutinį gitą?

Norint atkurti viską prieš tai, kai jis buvo įvykdytas iki paskutinio įsipareigojimo, mes turime atstatyti pataisą į HEAD.

  1. Jei nenorite išsaugoti atliktų pakeitimų:

     git reset --hard HEAD^ 
  2. Jei norite išsaugoti pakeitimus:

     git reset --soft HEAD^ 

Dabar patikrinkite savo git žurnalą. Jis parodys, kad mūsų paskutinis taisymas buvo pašalintas.

214
23 апр. atsakymas į Ranjithkumar Ravi pateikiamas balandžio 23 d 2014-04-23 14:21 '14, 14:21, 2014-04-23 14:21

Jei norite rasti teisingą būseną, naudokite reflogą.

 git reflog 

2019

172
07 янв. atsakymas, kurį pateikė Shubham Chaudhary 07 Jan 2014-01-07 01:34 '14 at 1:34 2014-01-07 01:34

„Atkurti darbo medį prieš paskutinį įvykį“

 git reset --hard HEAD^ 

„Išvalyti nežinomus failus iš darbo medžio“

 git clean 

žr. - „ Git“ greita nuoroda

PASTABA. Ši komanda pašalins ankstesnį įvykį, todėl naudokite jį atsargiai! git reset --hard saugesnis -

167
03 окт. atsakymas duotas Ravi_Parmar 03 spalis. 2013-10-03 15:43 '13, 15:43, 2013-10-03 15:43

Pirmasis leidimas:

 git reflog 

Jis parodys visus galimus veiksmus, kuriuos atlikote savo saugykloje, pavyzdžiui, įvykdyti, sujungti, traukti ir tt

Tada atlikite:

 git reset --hard ActionIdFromRefLog 
150
11 окт. spalio 11 d. atsakymą pateikė U. Ali . 2013-10-11 17:41 '13, 17:41, 2013-10-11 17:41

Atšaukti paskutinį įvykį:

git reset --soft HEAD^ arba git reset --soft HEAD~

Taip bus atšauktas paskutinis įvykis.

Čia - --soft reiškia iš naujo nustatyti nustatymus.

HEAD~ arba HEAD^ reiškia eiti į įsipareigojimą prieš HEAD.


Pakeiskite paskutinį įvykį nauju:

 git commit --amend -m "message" 

Jis pakeis paskutinį įvykį nauju fiksatoriumi.

141
06 марта '16 в 14:53 2016-03-06 14:53 atsakymas pateikiamas akshay_rahar kovo 06 d. 16:53 2016-03-06 14:53

Kitas būdas:

Padarykite užklausą dėl filialo, kurį norite grąžinti, tada grąžinkite vietinę darbo kopiją atgal į įsipareigojimą, kurį norite būti paskutiniu nuotoliniame serveryje (viskas po jo). Norėdami tai padaryti, dešiniuoju pelės klavišu spustelėjau „SourceTree“ ir pasirinkau „Atstatyti BRANCHNAME prie šio įsipareigojimo“.

Tada eikite į vietinį saugyklų katalogą ir paleiskite šią komandą:

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

Tai ištrins visus įvykius po dabartinės vietos saugykloje, bet tik vienam filialui.

136
13 мая '13 в 20:12 2013-05-13 20:12 atsakymas pateikiamas „ CommaToast“ gegužės 13 d., 13 val., 12 val. 2013-05-13 20:12

Įveskite git log ir raskite naujausią maišos kodą ir įveskite:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 atsakymą pateikė vartotojo853293 gegužės 15 d., 13:16 2013-05-15 16:12

Mano atveju, aš netyčia padariau kai kuriuos failus, kurių nenorėjau. Taigi aš tai padariau ir jis dirbo:

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

Patikrinkite rezultatus gitk arba git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 atsakymą pateikė egridasovas liepos 18 d., 13 val., 9:41 2013-07-18 09:41

Naudokite „ SourceTree“ (grafinę „Git“ priemonę), kad pamatytumėte savo įsipareigojimus ir medį. Galite rankiniu būdu iš naujo nustatyti jį dešiniuoju pelės klavišu.

113
29 авг. Atsakymas suteiktas iOS Coder 29 rug. 2013-08-29 19:18 '13, 19:18, 2013-08-29 19:18

Jei norite grįžti prie ankstesnės versijos, visam laikui ištrinkite visus neprivalomus pakeitimus:

 git reset --hard HEAD~1 
111
28 авг. atsakymas pateikiamas 2003 m. rugpjūčio 28 d. 2014-08-28 19:03 '14, 19:03, 2014-08-28 19:03

Yra du pagrindiniai scenarijai.

Jūs nespaudėte įsipareigojimo

Jei problema susijusi su papildomais failais, kuriuos --amend (ir nenorite jų naudoti saugykloje), galite juos ištrinti naudodami „ git rm ir tada - dar --amend su „ --amend

 git rm <pathToFile> 

Taip pat galite ištrinti visus katalogus -r arba netgi sujungti su kitomis bash komandomis.

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

Ištrinus failus, galite įsipareigoti naudodami parinktį --amend

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

Tai leis jums perrašyti neseniai įvykdytą vietinį įvykį, pašalinti nereikalingus failus, todėl šie failai niekada nebus siunčiami stumti ir bus ištrinti iš vietinio .git saugyklos per GC.

Jau spustelėjote įsipareigojimą

Tą patį sprendimą galite taikyti kitam scenarijui ir paleisti „ git push naudodami -f parinktį į -f , tačiau tai nerekomenduojama, nes ji perrašo ištrintą istoriją su skirtingais pakeitimais (tai gali pakenkti saugyklai).

Vietoj to, jūs privalote įsipareigoti be „ --amend (prisiminti šį pakeitimą): ši parinktis perrašo paskutinio įvykio istoriją.

111
12 сент. atsakymas yra dseminara 12 sep . 2014-09-12 17:51 '14, 17:51 2014-09-12 17:51

Vietiniam tvirtinimui

 git reset --soft HEAD~1 

arba, jei nepamirsite tiksliai, kokia fiksacija yra įmanoma, galite naudoti

 git rm --cached <file> 

Norėdami nuspausti

Teisingas būdas pašalinti failus iš saugyklos istorijos yra naudoti „ git filter-branch . Tai yra,

разделе git-filter-branch (1) Manual . 

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