Atšaukti git atšaukimą

Ar kas nors žino, kaip lengva atšaukti git'o atkūrimą?

Vienintelis būdas prisiminti - eiti ranka:

  • patikrinkite tėvų narį abiejuose filialuose
  • tada sukurkite tempo šaką
  • „Cherry“ pasirinkite visus nustatymus rankiniu būdu
  • pakeiskite šaką, kurioje aš vėl įdiegiau rankiniu būdu sukurtą filialą

Mano dabartinėje situacijoje tai veiks, nes galiu lengvai aptikti abiejų šakų fiksacijas (vienas buvo mano dalykas, kitas mano kolega).

Vis dėlto mano požiūris man atrodo neoptimalus ir klaidingas (tarkime, aš tiesiog perskaičiau du savo filialus).

Bet kokios idėjos?

Paaiškinimas: kalbu apie pakartotinį diegimą, kurio metu buvo pakartota daugybė įsipareigojimų. Ne tik vienas.

2580
25 сент. webmat rinkinys 25 rugsėjis 2008-09-25 20:59 '08 at 8:59 pm 2008-09-25 20:59
@ 17 atsakymų

Paprasčiausias būdas yra rasti filialo galvos fiksavimą, kaip jis buvo prieš pat atsisiuntimo pradžią .

 git reflog 

ir iš naujo nustatykite dabartinį atšaką (su įprastomis atsargumo priemonėmis, kad --hard visiškai tikri, prieš perparduodami su „ --hard parinktimi).

Tarkime, kad senas įsipareigojimas buvo HEAD@{5} ref žurnale:

 git reset --hard HEAD@{5} 

Windows sistemoje gali tekti pateikti nuorodą:

 git reset --hard "HEAD@{5}" 

Senojo kandidato istoriją galite patikrinti vykdydami git log HEAD@{5} („Windows“: „ git log "HEAD@{5}" ).

Jei jūs git reflog branchname@{1} kiekvieno filialo duomenų, paprasčiausiai turėtumėte git reflog branchname@{1} , nes atkūrimas atskiria filialo filialą, kol jis prisijungia prie galutinės galvutės. Vis dėlto aš jį dvigubai patikrinčiau, nes neseniai jo neperžiūrėjau.

Pagal numatytuosius nustatymus visi atspindžiai yra aktyvinami ne be ploto saugykloms:

 [core] logAllRefUpdates = true 
3557
25 сент. CB Bailey atsakymas, rugsėjo 25 d 2008-09-25 22:56 '08 10:56 val. 2008-09-25 22:56

Tiesą sakant, perkrovimas išsaugo pradinį tašką į ORIG_HEAD , todėl paprastai tai yra taip paprasta, kaip:

 git reset --hard ORIG_HEAD 
border=0

Tačiau reset , rebase ir merge visus originalius HEAD rodiklius ORIG_HEAD , taigi, jei atlikote bet kurią iš šių komandų, nes ORIG_HEAD , kurį bandote atšaukti, turės būti naudojamas reflog.

1267
28 марта '09 в 16:24 2009-03-28 16:24 atsakymą pateikė Pat Notz kovo 28 d., 09:24 , 2009-03-28 16:24

Charleso atsakymas veikia, bet jūs galite tai padaryti:

 git rebase --abort 

valymui po reset .

Priešingu atveju, galite gauti pranešimą „ Interactive rebase already started “.

330
27 июля '09 в 21:21 2009-07-27 21:21 atsakymą Allan pateikė liepos 27 d. 09:21 21:21 2009-07-27 21:21

Žinoma, geriausias sprendimas yra filialo iškrovimas į suvyniotą objektą, nustatantį seną antgalį, nes jis atkuria ankstesnę būseną be jokių pastangų. Bet jei praradote šiuos įsipareigojimus (pvz., Nes esate šiukšliadėžė), tuo tarpu jūsų saugykla buvo surinkta arba tai yra naujas klonas), visada galite vėl atšaukti filialą. Raktas į tai yra --onto jungiklis.

Tarkime, jūs turėjote temos šaką, 0deadbeef vadinamą topic , kad 0deadbeef master kai master galas buvo 0deadbeef . Tam tikru topic filialo tašku atlikote „ git rebase master . Dabar norite jį atšaukti. Štai kaip:

 git rebase --onto 0deadbeef master topic 

Taip bus imtasi visų topic esančių punktų, kurių nėra 0deadbeef , ir atkurti juos per 0deadbeef .

Su „ --onto galite atkurti savo istoriją beveik bet kokia forma.

Smagiai.:))

79
26 сент. rugsėjo 26 d. atsakymas į Aristotelio Pagaltzį 2008-09-26 05:08 '08, 5:08 am. 2008-09-26 05:08

Aš faktiškai įdėjau atsarginę žymą į filialą prieš atliekant bet kokią nontrivinę operaciją (dauguma permutacijų yra nereikšmingos, bet norėčiau tai padaryti, jei kažkur atrodo sudėtinga).

Atkūrimas yra toks pat lengvas kaip git reset --hard BACKUP .

64
12 мая '09 в 23:57 2009-05-12 23:57 atsakė Alex Gontmakher gegužės 12 d., 09:57 2009-05-12 23:57

Esu nustebęs, kad niekas to dar nepaminėjo. „Rebase“ palieka tą pačią būseną kaip „ ORIG_HEAD , todėl galite grąžinti paskutinį pakartotinį veiksmą:

 git reset --hard ORIG_HEAD 
60
24 июля '18 в 14:12 2018-07-24 14:12 Atsakymą pateikė Meligy, liepos 24 d., 18 val., 14:12 val

Jei perkėlėte savo filialą į nuotolinį saugyklą (paprastai kilmę), ir tada sėkmingai nukreipėte ( git rebase --abort ) („ git rebase --abort suteikia„ Nėra peradresavimo “), galite lengvai atkurti pramonę naudodami komandą:

git reset - neteisingas startas / {filialo pavadinimas}

Pavyzdys:

 $ ~/work/projects/{ProjectName} $ git status On branch {branchName} Your branch is ahead of 'origin/{branchName}' by 135 commits. (use "git push" to publish your local commits) nothing to commit, working directory clean $ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName} HEAD is now at 6df5719 "Commit message". $ ~/work/projects/{ProjectName} $ git status On branch {branchName} Your branch is up-to-date with 'origin/{branchName}. nothing to commit, working directory clean 
55
28 сент. Atsakymas, kurį pateikė Maksym Sep 28 2015-09-28 15:43 '15 15:43 2015-09-28 15:43

Jei nebaigėte pakartotinės versijos ir viduryje, atlikite šiuos veiksmus:

 git rebase --abort 
51
15 окт. Alex atsakymą pateikė spalio 15 d. 2014-10-15 23:20 '14, 23:20 2014-10-15 23:20

Naudojant reflog man nebuvo.

Tai, kas man teko, buvo panaši į čia aprašytą. Atidarykite .git / logs / refs failą, pavadintą iš naujo įdiegtos šakos ir suraskite eilutę, kurioje yra „rebase finsihed“, kažką panašaus į:

 5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878 

Išduokite antrą eilutėje nurodytą įvykį.

 git checkout 88552c8f 

Kai tik tai buvo patvirtinta, aš praradau savo pakeitimus ir atsiskleidžiau.

 git log git checkout -b lost_changes 
16
20 февр. Atsakymą Kris pateikė vasario 20 d. 2012-02-20 16:59 '12, 16:59 pm 2012-02-20 16:59

Už kelis įsipareigojimus atminkite, kad bet koks įsipareigojimas yra susijęs su visa istorija, vedančia į tą pataisymą. Todėl, Charles'o atsakyme, perskaitykite „senąjį pataisą“ kaip „naujausią iš senųjų įsipareigojimų“. Jei atkursite, kad ją išspręstumėte, visa istorija, vedanti į šį pataisymą, vėl pasirodys. Tai turėtų daryti tai, ko norite.

15
26 сент. Greg Hewgill atsakymas, rugsėjo 26 d 2008-09-26 00:36 '08 0:36 2008-09-26 00:36

Po @Allano ir @ Zearino sprendimo, norėčiau tik pateikti komentarą, tačiau neturiu pakankamai reputacijos, todėl naudoju šią komandą:

Vietoj „ git rebase -i --abort (pastaba -i ), aš tiesiog turėjau atlikti git rebase --abort ( be -i ).

Naudojant „ -i ir „ --abort , tuo pačiu metu „Git“ ragina parodyti naudojimų / parametrų sąrašą.

Taigi mano ankstesnis ir dabartinis šakos statusas su šiuo sprendimu:

 matbhz@myPc /my/project/environment (branch-123|REBASE-i) $ git rebase --abort matbhz@myPc /my/project/environment (branch-123) $ 
11
12 марта '15 в 0:26 2015-03-12 00:26 atsakymą pateikė Matheus Felipe kovo 15 d. 15 val. 0:26 2015-03-12 00:26

Jei sėkmingai iš naujo įdiegėte nuotolinį filialą ir negalite atlikti git rebase --abort , galite vis dar padaryti keletą gudrybių, kad išsaugotumėte savo darbą ir nebūtų priversti paspaudimai. Tarkime, kad jūsų dabartinė filialas, kuris buvo klaidingas, vadinamas your-branch ir seka origin/your-branch

  • git branch -m your-branch-rebased # pervardija dabartinį filialą
  • git checkout origin/your-branch # išsiregistravimas į naujausią valstybę, žinomą kilmę
  • git checkout -b your-branch
  • patikrinkite „ git log your-branch-rebased , palyginkite su „ git log your-branch ir nustatykite trūkstamus įsipareigojimus
  • git cherry-pick COMMIT_HASH “ kiekvienam įsipareigojimui vykdyti your-branch-rebased
  • spustelėkite savo pakeitimus. Atminkite, kad du vietiniai filialai yra prijungti prie remote/your-branch , ir turėtumėte paspausti tik your-branch
10
23 июня '16 в 12:23 2016-06-23 12:23 atsakymas pateikiamas Sergejui P. žinomam Azūrai birželio 23 d., 16 d., 12:23 2016-06-23 12:23

Tiesiog:

 git rebase --abort 

?

6
02 дек. Ian Ellis atsakymas 02 Dec 2017-12-02 20:55 '17 at 8:55 2017-12-02 20:55

Pasakykite, aš iš naujo įdiegiu vedlį į savo funkcijų skyrių, ir aš gaunu 30 naujų įsipareigojimų, kurie kažką sulaužė. Radau, kad dažnai paprasčiausia paprasčiausiai pašalinti blogus įsipareigojimus.

 git rebase -i HEAD~31 

Interaktyvi permutacija paskutinėms 31 fiksacijai (ji nesugadina, jei pasirinksite per daug).

Tiesiog pasiimkite įsipareigojimus, kuriuos norite atsikratyti, ir pažymėkite juos „d“ vietoj „pick“. Dabar įsipareigojimai yra pašalinami, veiksmingai sunaikinant atnaujinimą (jei ištrinate tik tuos įvykius, kuriuos ką tik gavote perkeliant).

3
09 февр. Atsakymas pateikiamas Hardev 09 Feb. 2017-02-09 15:25 '17, 15:25 pm 2017-02-09 15:25

Jei esate filiale, galite naudoti:

 git reset --hard @{1} 

Yra ne tik atskaitos žurnalas HEAD (gaunamas su git reflog ), bet ir kiekvienos šakos reflogai (gaunami su git reflog <branch> ). Taigi, jei naudojate master tada git reflog master visus šios temos pakeitimus. Šiuos pakeitimus galite peržiūrėti naudodami master@{1} , master@{2} ir kt.

git rebase paprastai keičia HEAD keletą kartų, tačiau dabartinis filialas bus atnaujintas tik vieną kartą.

@{1} yra tik dabartinio filialo nuoroda , todėl ji yra lygi master@{1} jei naudojate master .

git reset --hard ORIG_HEAD neveiks, jei naudosite „ git reset per interaktyviąją rebase .

0
10 янв. atsakymas pateikiamas devconsole 10 sausis 2019-01-10 15:21 '19, 15:21 pm 2019-01-10 15:21

Jei sugadinsite kažką per „ git rebase --abort git“, pvz., „ git rebase --abort , o jūs neturite git rebase --abort failų, jie bus prarasti, o git reflog nepadės. Tai atsitiko man, ir jums reikės galvoti už >right-click->local history pelės right-click->local history su pelės mygtuku right-click->local history pelės right-click->local history ir grįžti į ankstesnę failo / aplanko būseną, nesvarbu, kokias klaidas padarėte naudojant versijos valdymo programinę įrangą. Visada gera turėti kitą nesėkmingą judėjimą.

-3
09 марта '16 в 12:19 2016-03-09 12:19 atsakymas pateikiamas ne vėliau kaip kovo 09–16 d. 12:19 2016-03-09 12:19

Jei norite atšaukti, galite įvesti šią komandą:

 git -c core.quotepath=false rebase --abort 
-8
15 марта '16 в 7:27 2016-03-15 07:27 atsakymą pateikė Kostya Andreev kovo 15, 16 d. 07:27 2016-03-15 07:27

Kiti klausimai apie žymes arba Ask a Question