Pakartokite kelis kartus

Turiu git repozitoriumą, kuris atrodo taip:

 A -> B -> C -> D -> HEAD 

Noriu, kad filialo galva nukreiptų į A, tai yra, noriu, kad B, C, D ir HEAD išnyktų, ir aš noriu, kad galva būtų sinonimas A.

Atrodo, kad galiu pabandyti iš naujo įdiegti (netaikoma, nes paspaudžiau jų tarpusavio pakeitimus) arba grįžau. Bet kaip galiu grąžinti kelis įsipareigojimus? Ar grąžinu vieną kartą? Ar užsakymas svarbus?

499
23 сент. nustatė Bill rugsėjo 23 d 2009-09-23 03:27 '09, 03:27 am. 2009-09-23 03:27
@ 11 atsakymų

Išplėsti tai, ką parašiau komentaruose

Bendroji taisyklė yra ta, kad neturėtumėte perrašyti (keisti) jūsų paskelbtos istorijos, nes kažkas galėtų remtis savo darbu. Jei perrašysite (pakeiskite) istoriją, turėsite problemų sujungiant jų pakeitimus ir juos atnaujinant.

Taigi, sprendimas yra sukurti naują komandą, kuri grąžintų pakeitimus , kuriuos norite atsikratyti. Tai galite padaryti naudodami git revert .

Turite tokią situaciją:

 A <- B <- C <- D <- kapitonas <- HEAD

(rodyklės čia nurodo rodyklės kryptį: „tėvų“ nuoroda įvykių atveju, viršutinė fiksacija filialo šakos atveju (filialo atsakymas) ir šakos pavadinimas HEAD nuorodos atveju).

Ką reikia sukurti:

 A <- B <- C <- D <- [(BCD) ^ - 1] <- kapitonas <- HEAD

kur "[(BCD) ^ - 1]" reiškia įsipareigojimą, kuris grąžina B, C, D. įsipareigojimų pakeitimus. Matematika sako, kad (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ - 1, todėl galite gauti reikiamą situaciją naudodami šias komandas:

 $ git revert --no-commit D $ git revert --no-commit C $ git revert --no-commit B $ git commit -m "the commit message" 

Alternatyvus sprendimas būtų išsiregistruoti įsipareigojimo A turinį ir įsipareigoti:

 $ git checkout -f A -- . $ git commit -a 

Tada turėsite tokią situaciją:

 A <- B <- C <- D <- A '<- kapitonas <- HEAD

„A“ pabaiga turi tą patį turinį, kaip ir „A“, bet yra kitoks įsipareigojimas (įsipareigojimo pranešimas, tėvai, įsipareigojimo data).

Jeff Ferlando sprendimas , pakeistas Charles Bailey , grindžiamas ta pačia idėja, tačiau naudoja gitų atkūrimą :

 $ git reset --hard A $ git reset --soft @{1} # (or ORIG_HEAD), which is D $ git commit 
778
24 сент. Jakub Narębski atsakymas 24 rugsėjis 2009-09-24 11:44 '09, 11:44 2009-09-24 11:44

Norėdami tai padaryti, jums reikia naudoti komandą „Atšaukti“, nurodydami norimų grįžti skaičių.

Atsižvelgdami į jūsų pavyzdį, turėsite tai padaryti (jei esate „pagrindiniame“ skyriuje):

 git revert master~3..master 

Tai sukurs naują įsipareigojimą jūsų vietiniame tinkle su „B“, „C“ ir „D“ įsipareigojimais (tai reiškia, kad atšaukia šių įvykdytų pakeitimų):

 A <- B <- C <- D <- BCD' <- HEAD 
126
31 июля '12 в 18:00 2012-07-31 18:00 Atsakymą pateikė Victor liepos 31 d. 12 val. 2012-07-31 18:00
 git reset --hard a git reset --mixed d git commit 

Tai veiks kaip kompensacija visiems. Pateikite gerą fiksavimo pranešimą.

36
23 сент. Jeff Ferland atsakymas, pateiktas rugsėjo 23 d 2009-09-23 03:45 '09 3:45 am 2009-09-23 03:45

Kaip ir Jakubo atsakymas, tai leidžia jums lengvai pasirinkti iš eilės einančius įsipareigojimus grįžti.

 # revert all commits from B to HEAD, inclusively $ git revert --no-commit B..HEAD $ git commit -m 'message' 
34
31 июля '14 в 21:49 2014-07-31 21:49 atsakymą pateikė „ konyak “ liepos 31 d. 14 d. 21:49 2014-07-31 21:49

Pirmiausia įsitikinkite, kad darbo kopija nepakeista. Tada:

 git diff HEAD commit_sha_you_want_to_revert_to | git apply 

ir tada tiesiog išspręskite. Nepamirškite dokumentuoti grąžinimo priežasties.

19
09 сент. atsakymas pateikiamas mateusz.fiolka 09 sep . 2014-09-09 16:13 '14, 16:13 2014-09-09 16:13

Grynas būdas, kurį aš rasiu naudinga

 git revert --no-commit HEAD~3.. 

Ši komanda grąžina paskutinius 3 įsipareigojimus su vienu įvykiu.

Taip pat perrašo istoriją.

12
29 марта '17 в 3:00 2017-03-29 03:00 atsakymas pateikiamas giliai kovo 29 d. 17 d. 3:00 2017-03-29 03:00

Aš taip nusiminusi, kad į šį klausimą negalima atsakyti. Kiekvienas kitas klausimas susijęs su tuo, kaip tinkamai grįžti ir išsaugoti istoriją. Šis klausimas sako: „Noriu, kad filialo galva nukreiptų į A, tai yra, aš noriu, kad B, C, D ir HEAD išnyktų , ir aš noriu, kad galva būtų sinonimas A.“

 git checkout <branch_name> git reset --hard <commit Hash for A> git push -f 

Daug išmokau skaitydamas „Yakub“ įrašą, bet kai kurie kompanijos vaikinai (turintys prieigą prie mūsų testavimo padalinio be „Pull-Request“) paspaudė kaip 5 blogi, bandydami ištaisyti ir ištaisyti klaidą ir ištaisyti padarytą klaidą 5 . Ne tik tai, bet vienas ar du traukiamieji prašymai, kurie dabar buvo blogi. Taigi pamiršite apie tai, aš rasiu paskutinį gerą pataisą (abc1234) ir tiesiog bėgau pagrindinį scenarijų:

 git checkout testing git reset --hard abc1234 git push -f 

Pasakiau kitiems 5 vaikinai, dirbantiems šiame repo, kad jie pastebės, kad per pastarąsias kelias valandas jie geriausiai pasikeis, ir paskutinio testo metu nuvalykite / persiųskite. Istorijos pabaiga.

11
12 июля '16 в 2:29 2016-07-12 02:29 atsakymas yra duotas Suamerei liepos 16 d., 16 val., 02:29 . 2016-07-12 02:29

Lengviausias būdas grąžinti grupę įsipareigojimų į bendrą saugyklą (kurią žmonės naudojasi ir norite išsaugoti istoriją) yra naudoti „ git revert kartu su „git rev-list . Pastarasis pateiks jums sąrašą įsipareigojimų, pirmasis grįš.

Yra du būdai tai padaryti. Jei norite pakartotinai kelis kartus įsipareigoti naudoti:

 for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert -n $i; done 

Tai reikštų, kad sugrąžintų reikiamų įsipareigojimų grupę, bet paliks visus pakeitimus darbiniame medyje, juos pataisykite kaip įprasta.

Kitas variantas yra, kad vienas įsipareigotų dėl kiekvieno atšaukto pakeitimo:

 for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-edit -s $i; done 

Pvz., Jei turite tipą, kuriame yra tipo fiksavimas

  o---o---o---o---o---o---> fff eee ddd ccc bbb aaa 

grįžti iš eee į bbb, paleisti

 for i in `git rev-list eee^..bbb`; do git revert --no-edit -s $i; done 
4
04 авг. atsakymas pateikiamas Ruslano Kabalino 04 rug. 2011-08-04 14:29 '11 at 14:29 pm 2011-08-04 14:29

Tai yra vieno iš sprendimų, pateiktų atsakant į „Jakub“, pratęsimas.

Man teko susidurti su situacija, kai įsipareigojimai, kuriuos man reikėjo sugrąžinti, buvo šiek tiek sudėtingi, o kai kurie įsipareigojimai buvo sujungti, ir man nereikėjo perrašyti istorijos. Aš negalėjau naudoti git revert komandų, nes galų gale susidūriau su konfliktais tarp papildomų pakeitimų. Baigiau naudodamas šiuos veiksmus.

Pirmiausia patikrinkite taikinio turinį, palikdami HEAD šakos viršūnėje:

 $ git checkout -f <target-commit> -- . 

(Pasitikėjimas yra interpretuojamas kaip įsipareigojimas, o ne failas, bet nurodo esamą katalogą.)

Tada nustatykite, kurie failai buvo įtraukti į užbaigtus įsipareigojimus, ir todėl juos reikia ištrinti:

 $ git diff --name-status --cached <target-commit> 

Įtraukti failai turėtų būti rodomi „A“ eilutės pradžioje, ir neturėtų būti jokių kitų skirtumų. Dabar, jei reikia ištrinti failus, atlikite šiuos failus ištrinti:

 $ git rm <filespec>[ <filespec> ...] 

Galiausiai atlikite pakeitimą:

 $ git commit -m 'revert to <target-commit>' 

Jei norite, įsitikinkite, kad grįšime į norimą būseną:

 $git diff <target-commit> <current-commit> 

Nėra jokių skirtumų.

3
08 нояб. Atsakymą pateikė Warren Dew 08 Nov. 2016-11-08 09:39 '16 at 9:39 2016-11-08 09:39

Nė vienas iš jų manęs nedirbo, todėl turėjau tris įsipareigojimus grįžti (paskutiniai trys įsipareigojimai), todėl aš:

 git revert HEAD git revert HEAD~2 git revert HEAD~4 git rebase -i HEAD~3 # pick, squash, squash 

Dirbo kaip žavesys :)

0
24 янв. Atsakymas duotas Dorian 24 jan. 2017-01-24 03:28 '17 at 3:28 2017-01-24 03:28

Jei norite laikinai nuspausti funkciją, galite naudoti kelias šias komandas.

Taip veikia.

git log - pretty = oneline | grep 'feature_name' | cut -d '' -f1 | xargs -n1 git sugrįžta --no-edit

-1
11 февр. atsakymą pateikė Ajit Singh 11 vasaris. 2016-02-11 21:47 '16 at 9:47 pm 2016-02-11 21:47

Kiti klausimai apie žymes arba užduoti klausimą