Atšaukti sujungimą „Git“, kuris dar nebuvo paspaustas

Mano pagrindiniame filiale vietiniu mastu git merge some-other-branch , bet niekada nepadariau pakeitimų į pradinį šeimininką. Aš nesiruošiau sujungti, todėl norėčiau ją atšaukti. Kai po susijungimo padariau git status , gavau šį pranešimą:

 # On branch master # Your branch is ahead of 'origin/master' by 4 commits. 

Remdamiesi kai kuriomis instrukcijomis, kurias radau , bandžiau paleisti

 git revert HEAD -m 1 

bet dabar gaunu šį pranešimą naudodamas „ git status :

 # On branch master # Your branch is ahead of 'origin/master' by 5 commits. 

Nenoriu, kad mano filialas priartėtų prie bandymų skaičiaus. Kaip grįžti prie šio taško?

3252
05 марта '10 в 22:24 2010-03-05 22:24 Matt Huggins paprašė kovo 5 d. 10 val. 10:24 val. 2010-03-05 22:24
@ 28 atsakymai

Su git reflog patikrinkite, kuris įsipareigojimas yra prieš sujungimą ( git reflog būtų geresnis variantas nei git log ). Tada galite jį iš naujo nustatyti naudodami:

 git reset --hard commit_sha 

Yra ir kitas būdas:

 git reset --hard HEAD~1 

Tai suteiks jums 1 įsipareigojimą.

Atminkite, kad bet kokie modifikuoti ir nepakeisti failai bus atkurti nepakeistą būseną . Jei norite juos išsaugoti, paslėpkite pakeitimus arba žr.


Kaip @Velmont pasiūlė toliau savo atsakyme, šiuo tiesioginiu atveju naudojama:

 git reset --hard ORIG_HEAD 

gali suteikti geresnių rezultatų, nes tai turėtų išsaugoti pakeitimus. ORIG_HEAD nurodys įsipareigojimą prieš pat susijungimą, taigi jums nereikia jo ieškoti.


border=0

Kitas patarimas yra naudoti „ --merge jungiklį vietoj „ --hard nes jis nereikalingai neišplauna failų:

 git reset --merge ORIG_HEAD 

- pasukti

Atkuria indeksą ir atnaujina darbo medyje esančius failus, kurie skiriasi nuo <commit> ir HEAD, bet saugo tuos, kurie skiriasi nuo indekso ir darbo medžio (t. Y. Su pakeitimais, kurie nebuvo įtraukti).

3585
05 марта '10 в 22:34 2010-03-05 22:34 Atsakymą pateikė Marcin Gil kovo 5 d. 10 val. 10.34 val. 2010-03-05 22:34

Darant prielaidą, kad jūsų vietinis šeimininkas nėra prieš startą / kapitoną, turėtumėte sugebėti daryti

 git reset --hard origin/master 
border=0

Tada jūsų vietinis master filialas turėtų atrodyti identiškas origin/master .

1321
17 марта '11 в 21:06 2011-03-17 21:06 atsakymas duotas atsitiktinai3 kovo 17 '11, 21:06 2011-03-17 21:06

Žr . 4 skyrių „Git“ knygoje ir originalų įrašą „Linus Torvalds“ .

Jei norite anuliuoti jau sukurtą sujungimą:

 git revert -m 1 commit_hash 

Būtinai grąžinkite grąžinamąją išmoką, jei vėl baigiate filialą, kaip sakė Linus.

1102
02 июня '11 в 19:31 2011-06-02 19:31 atsakymą pateikė Jurijus Geinishas birželio 2 d. 11 d. 19:31 2011-06-02 19:31

Keista, kad paprasčiausiai trūksta komandos. Dauguma atsakymų veikia, bet tiesiog padarytas sujungimas yra paprastas ir saugus būdas :

 git reset --merge ORIG_HEAD 

Nuoroda ORIG_HEAD nurodys pradinį įsipareigojimą prieš sujungimą.

(Parametras „ --merge neturi nieko bendro su susijungimu. Tai tiesiog kaip git reset --hard ORIG_HEAD , bet saugesnis, nes jis nesusijęs su nekomerciniais pakeitimais.)

882
29 янв. atsakymas pateikiamas odinho - Velmont 29 sausis 2013-01-29 18:46 '13, 18:46, 2013-01-29 18:46

Jei naujesnės „git“ versijos nebaigėte sujungimo ir turite sujungimo konfliktą, galite tiesiog:

 git merge --abort 

man git merge :

[Šis] gali būti pradėtas tik po to, kai sujungimas sukėlė konfliktus. git merge --abort sujungimo procesą ir bandys atkurti iš anksto susijungimo būseną.

330
12 февр. Travis Reeder atsakymas vasario 12 d 2013-02-12 05:13 '13, 5:13, 2013-02-12 05:13

Turite iš naujo nustatyti ankstesnį įvykį. Tai turėtų veikti:

 git reset --hard HEAD^ 

Arba grįžkite į HEAD^^ kad grąžintumėte pataisą. Jei nesate tikri, kiek žingsnių turite imtis, visada galite pateikti visą nuorodą į SHA.

Jei turite problemų, o jūsų pagrindinė filialas neturėjo vietinių pakeitimų, galite atkurti origin/master .

113
05 марта '10 в 22:31 2010-03-05 22:31 atsakymas pateikiamas MBO kovo 10 d. 10 val. 22:31 2010-03-05 22:31

Neseniai aš naudoju git reflog kad git reflog padėti. Tai iš esmės veikia tik tuo atveju, jei sujungimas yra paprastas ir jis buvo jūsų kompiuteryje.

git reflog gali grįžti kažką panašaus:

 fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch 43b6032 HEAD@{1}: checkout: moving from master to my-branch e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e b41ea52 HEAD@{4}: reset: moving to HEAD^ 8400a0f HEAD@{5}: rebase: aborting 

Pirmoji eilutė rodo, kad įvyko susijungimas. Antroji eilutė yra laikas prieš mano susijungimą. Aš paprasčiausiai git reset --hard 43b6032 kad šis filialas būtų priverstas sekti prieš susijungimą ir perdavimą.

80
19 дек. Atsakymą pateikė Parris 19 d. 2014-12-19 20:51 '14, 20:51 2014-12-19 20:51

Šiuolaikinio „Git“ pagalba galite:

 git merge --abort 

Senesnė sintaksė:

 git reset --merge 

Senoji mokykla:

 git reset --hard 

Tiesą sakant, verta paminėti, kad „ git merge --abort lygiavertis tik git reset --merge , jei MERGE_HEAD . Tai galima rasti „Git“ žinyne, skirtoje sujungimo komandai.

 git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

Po nepavykusio sujungimo, kai nėra MERGE_HEAD , nepavykusį susijungimą galima atšaukti su git reset --merge , bet nebūtinai su git merge --abort - todėl jie yra ne tik to paties dalyko senoji ir nauja sintaksė .

Asmeniškai manau, kad git reset --merge daug galingesnis ir naudingesnis kasdieniame darbe, taigi aš visada naudoju.

47
08 мая '15 в 22:13 2015-05-08 22:13 atsakymą pateikė Martin G 08 gegužės 15 d. 10:13 2015-05-08 22:13

Na, atsakymai, kuriuos man davė kiti žmonės, buvo artimi, bet tai neveikė. Štai ką aš padariau.

Tai daroma ...

 git reset --hard HEAD^ git status 

... davė man kitą statusą.

 # On branch master # Your branch and 'origin/master' have diverged, # and have 3 and 3 different commit(s) each, respectively. 

Tada dar keletą kartų turėjau įvesti tą pačią git reset komandą. Kiekvieną kartą, kai tai padariau, pranešimas pasikeitė į vieną, kaip matote toliau.

 > git reset --hard HEAD^ HEAD is now at [...truncated...] > git status # On branch master # Your branch and 'origin/master' have diverged, # and have 3 and 3 different commit(s) each, respectively. > git reset --hard HEAD^ HEAD is now at [...truncated...] > git status # On branch master # Your branch and 'origin/master' have diverged, # and have 2 and 3 different commit(s) each, respectively. > git reset --hard HEAD^ HEAD is now at [...truncated...] > git status # On branch master # Your branch and 'origin/master' have diverged, # and have 1 and 3 different commit(s) each, respectively. > git reset --hard HEAD^ HEAD is now at [...truncated...] > git status # On branch master # Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded. 

Tuo metu aš pamačiau, kad pasikeitė būsenos pranešimas, todėl bandžiau atlikti git pull , ir atrodė, kad jis veikia:

 > git pull Updating 2df6af4..12bbd2f Fast forward app/views/truncated | 9 ++++++--- app/views/truncated | 13 +++++++++++++ app/views/truncated | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) > git status # On branch master 

Trumpai tariant, mano komandos pasiekė:

 git reset --hard HEAD^ git reset --hard HEAD^ git reset --hard HEAD^ git reset --hard HEAD^ git pull 
36
05 марта '10 в 22:54 2010-03-05 22:54 Atsakymą pateikė Matt Huggins, kovo 05 '10, 22:54 2010-03-05 22:54

Jei norite rasti ankstesnį patikrinimą, galite naudoti git reflog . Kartais tai yra gera būklė, į kurią norite grįžti.

Visų pirma

 $ git reflog $ git reset --hard HEAD@{0} 
21
18 янв. atsakymas pateikiamas stephjang 18 jan. 2014-01-18 01:36 '14 ne 1:36 2014-01-18 01:36

Jei to dar nepadarėte, galite naudoti

 $ git checkout -f 

Atšaukite sujungimą (ir viską, ką darėte).

13
18 янв. Atsakymą Idealmind pateikė sausio 18 d. 2013-01-18 18:25 '13, 18:25, 2013-01-18 18:25

Gavęs šį klausimą, taip pat kreipėsi į grįžimą prie sutapimo su pradžia (ty NO prasideda nuo pradžios). Toliau studijavau, kad čia buvo nustatyta iš reset komanda:

git reset --hard @{u}

Pastaba: @{u} yra origin/master santrumpa. (Ir, žinoma, jums reikia šio nuotolinio saugyklos.)

11
17 февр. Leanne atsakymas, pateiktas vasario 17 d 2017-02-17 00:54 '17 - 0:54 2017-02-17 00:54

Jei norite grąžinti susijungimą ar paleisti iš naujo, naudodami tik vieną komandą galite naudoti tik dvi komandas:

  • git reset --hard commitHash (turite naudoti įsipareigojimą, kurį norite paleisti iš naujo, pvz., 44a587491e32eafa1638aca7738)
  • git push origin HEAD --force (naujos vietinės priimančiosios filialo siuntimas į pradžią / šeimininką)

Sėkmės ir eikite į priekį!

10
13 дек. Atsakymą pateikė Matheus Abreu 13 d. 2014-12-13 02:16 '14, 2:16 2014-12-13 02:16

Tiesiog už papildomą parinktį aš iš esmės sekiau filialo modelį, aprašytą čia: http://nvie.com/posts/a-successful-git-branching-model/ ir, kaip toks, sujungiu su --no-ff ( greičiau).

Aš tik perskaičiau šį puslapį, nes netyčia atsitiktinai sujungiau testavimo šaką, o ne savo išleidimo šaką su diegimo vedliu (svetainė, vedlys yra kažkas, kas yra gyva). Bandymų skyriuje yra dvi kitos šakos, sujungtos su ja ir numeruojama apie šešis.

Taigi, norint grąžinti visą sandorį, man reikėjo vieno git reset --hard HEAD^ ir grąžino visą susijungimą. Kadangi susijungimai nebuvo greitai perorientuoti, susijungimas buvo blokas ir vienas žingsnis atgal yra „filialas, kuris nėra susijungęs“.

10
09 июня '11 в 3:54 2011-06-09 03:54 atsakymą pateikė Damien Byrne birželio 11 d. 11 val. 03:54 2011-06-09 03:54

Paprasčiausias atsakymas pateikiamas odinho - Velmont

Pirmiausia git reset --merge ORIG_HEAD

Tiems, kurie žiūri iš naujo, kai paspaudžiami pakeitimai, tai atlikite (nes tai yra pirmasis pranešimas, kuris buvo aptiktas sujungus klausimus git reset)

git push origin HEAD --force

Tai bus atstatyta taip, kad po paspaudimo negausite sujungtų pakeitimų.

7
03 нояб. Atsakymas pateikiamas Harsha 03 lapkričio. 2017-11-03 02:22 '17, 2:22 am 2017-11-03 02:22

Šią problemą galėjau išspręsti naudodamas vieną komandą, kurioje nėra pataisymo identifikatoriaus paieškos.

 git reset --hard remotes/origin/HEAD 

Priimtas atsakymas man neveikė, tačiau ši komanda pasiekė savo ieškomus rezultatus.

6
25 июля '18 в 12:55 2018-07-25 12:55 atsakymą pateikė Ralph Ritoch liepos 25 d. 18 val. 12:55 2018-07-25 12:55

Jei jūsų susiliejimas ir atitinkami įsipareigojimai dar nebuvo paspaudžiami, visada galite pereiti į kitą filialą, ištrinti originalą ir vėl jį sukurti.

Pavyzdžiui, aš netyčia sujungiau plėtros filialą į kapitoną ir norėjau jį atšaukti. Naudodami šiuos veiksmus:

 git checkout develop git branch -D master git branch -t master origin/master 

Voila! Meistras yra tame pačiame etape, kaip ir kilmė, ir neteisingai sujungta būsena ištrinama.

5
26 июня '12 в 14:15 2012-06-26 14:15 atsakymas yra duotas Stephanui birželio 26 d., 12 val. 15.15 val. 2012-06-26 14:15

Jei jums reikia sprendimo iš komandų eilutės, siūlau tiesiog eiti su MBO atsakymu.

Jei esate pradedantysis, jums gali patikti grafinis požiūris:

  • Išjungti „ gitk (iš komandų eilutės arba dešiniuoju pelės mygtuku spustelėkite failų naršyklėje, jei turite)
  • Jūs galite lengvai apibrėžti susijungimo pataisą - pirmąjį mazgų viršų su dviem tėvais
  • Sekite nuorodą į pirmąjį / kairįjį tėvą (tą, kuris yra jūsų dabartiniame filiale prieš susijungimą, paprastai raudona man)
  • Pasirinktame įvykyje dešiniuoju pelės klavišu spustelėkite skiltį „Atstatyti“, pasirinkite ten esantį kietąjį atstatymą.
4
21 марта '13 в 17:38 2013-03-21 17:38 atsakymas įteiktas kovo 21 d., 13 val. 17:38 2013-03-21 17:38

Strategija: Sukurkite naują filialą, kuriame viskas buvo gerai.

Loginis pagrindas: Sunku grąžinti susijungimą. Per daug sprendimų, priklausomai nuo daugelio veiksnių, pvz., Dėl to, ką padarėte ar spustelėjote sujungimo metu, arba nuo naujų susijungimų. Jūs taip pat turite turėti pakankamai gilų supratimą apie git, kad pritaikytumėte šiuos sprendimus savo verslui. Jei aklai sekite kai kurias instrukcijas, galite gauti „tuščius susiliejimus“, kur niekas nebus sujungtas, o tolesni bandymai sujungti gitą jums pasakys „Jau atnaujintas“.

Sprendimas:

Tarkime, kad norite sujungti dev in feature-1 .

  • Raskite versiją, kurią norite sujungti:

     git log --oneline feature-1 a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one 
  • Išbandykite jį (grįžkite atgal):

     git checkout e5f6g7h8 
  • Sukurkite naują filialą ir patikrinkite:

     git checkout -b feature-1 

Dabar galite iš naujo sujungti:

  • Sujungti: git merge dev

  • Teisingi sujungimo konfliktai.

  • Įsipareigojimas: git commit

  • Kai esate patenkinti rezultatais, ištrinkite seną filialą: git branch --delete feature-1

4
11 июня '15 в 18:42 2015-06-11 18:42 atsakymas pateikiamas pyb birželio 11, 15, 18:42 2015-06-11 18:42

Žinau, kad tai nėra tiesioginis atsakymas į šį klausimą, tačiau, atsižvelgiant į tai, kaip sudėtinga ši problema yra saugyklos istorijoje, norėjau pasidalinti savo patirtimi ir leisti visiems žinoti, kad naujos filialo sukūrimas nuo paskutinio įsipareigojimo sujungti gali būti gera alternatyva, daugiausia, kai susijungimas jau buvo paspaustas.

2
19 июля '12 в 19:04 2012-07-19 19:04 atsakymą pateikė Javis , liepos 19 d., 12 val., 19:04, 2012-07-19 19:04
  • Pirma, įsitikinkite, kad darote viską.

  • Tada iš naujo nustatykite savo saugyklą į ankstesnę veikimo būseną:

     $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 

    arba naudodami --hard ( , jis ištrins visus vietinius, ne padarytus pakeitimus! ):

     $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard 

    Prieš sujungdami neteisingą nustatymą, naudokite ten esantį maišą.

  • Ankstesnės teisingos versijos viršuje patikrinkite, ar norite užfiksuoti:

     $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f ... commit 16b373a96b0a353f7454b141f7aa6f548c979d0a ... 
  • Taikykite savo teises į tinkamos saugyklos versijos viršų:

    • Naudojant vyšnių rinkiklį (kai kurių esamų įsipareigojimų pakeitimai)

        git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7 
    • Arba pasirinkdami vyšnių diapazoną:

      • Prieš sujungdami juos pirmiausia patikrinkite teisingus pakeitimus:

         git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f 
      • Prieš sujungdami juos pirmiausia patikrinkite teisingus pakeitimus:

         git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f 

        kur yra teisingas įsipareigojimas, kurį padarėte (išskyrus klaidingai įrašytą susijungimą).

1
29 янв. atsakymas pateikiamas kenorb 29 d 2013-01-29 18:09 '13, 18:09 2013-01-29 18:09

Manau, kad galite atlikti git rebase -i [hash] [branch_name] , kur [hash] yra identifikavimo hash, jei vis tiek norite atsukti atgal, plius vienas (arba bet koks įsipareigojimas, kurį norite siųsti) tada ištrinkite eilutes, skirtas prisiimti redaktoriui, kurio jums nereikia. Išsaugokite failą. Išeiti Melstis. Ir jis turi būti iš naujo apverstas. Gali tekti atlikti git reset --hard , bet šiuo metu ji turėtų būti gerai. Taip pat galite ją naudoti tam tikriems įsipareigojimams traukti iš kamino, jei nenorite jų išsaugoti savo istorijoje, tačiau tai gali palikti savo saugyklą tokioje būsenoje, kad jums tikriausiai nereikia.

1
08 марта '10 в 5:55 2010-03-08 05:55 atsakymas duotas tychoish Kovo 08 '10, 5:55 2010-03-08 05:55

Jei sujungiate:

 git reset HEAD~1 # Make sure what you are reverting is in fact the merge files git add . git reset --hard 
1
10 нояб. Atsakymas duotas Dorian 10 lapkričio. 2016-11-10 18:57 '16 at 18:57 2016-11-10 18:57

Tokiu atveju norėsite atkurti savo šaką su git reset --hard <branch_name> . Jei norite išsaugoti pakeitimus prieš jų registrą, įsitikinkite, kad sukuriate naują filialą ir „ git checkout <branch_name> .

Galite grąžinti būseną konkrečiam git reset --hard <commit_id> su git reset --hard <commit_id> .

Jei pakeitimai buvo git revert <branch_name> , galite naudoti git revert <branch_name> vietoj git revert <branch_name> . Būtinai patikrinkite, kaip naudoti „ git revert“ ir „git checkout “ kituose scenarijuose.

0
29 мая '18 в 13:21 2018-05-29 13:21 atsakymą pateikė „ Nesha Zoric “ gegužės 18 d. 18 val. 21:21 2018-05-29 13:21

Jei pastebėsite, kad jums reikia grįžti iš karto po sujungimo, ir po susiliejimo bandymo nieko git reset --hard HEAD@{1} , galite tiesiog atlikti šią komandą: git reset --hard HEAD@{1} .

Iš esmės jūsų „ sha susiliejimas nukreips į HEAD@{0} jei po susiliejimo nieko nebus nustatyta, todėl HEAD@{1} bus ankstesnis taškas prieš sujungimą.

0
26 апр. atsakymą pateikė Dut A. 26 balandis. 2016-04-26 21:52 '16 at 21:52 pm 2016-04-26 21:52

Paprasčiausias paprasčiausias šansas, daug paprastesnis nei bet kas, yra čia:

Pašalinkite vietinį padalinį (vietinį, ne nuotolinį) ir vėl vilkite. Tokiu būdu atšaukiate pagrindinio filialo pakeitimus ir kažkas turės įtakos pakeitimui, kurio nenorite spustelėti. Vykdykite.

0
15 июля '16 в 17:16 2016-07-15 17:16 atsakymą Luisas davė liepos 16 d. 16, 17:16 2016-07-15 17:16

Jei esate susijungimo procese, visada galite jį nutraukti

0
13 дек. atsakymą pateikė llioor 13 dec. 2018-12-13 17:05 '18, 5:05 val. 2018-12-13 17:05

Galite naudoti komandą git - reset.

git - reset - iš naujo nustatyti esamą HEAD

nurodytą būseną. git Atstatyti [--mixed

- minkštas | --hard | --merge] [-q] [] git Atstatyti [-q] []

[-] ... git Atstatyti - siuntimą

[] [-] [...]

„Git“ atstatymas

-13
05 марта '10 в 22:28 2010-03-05 22:28 atsakymą pateikė „ NebuSoft“ kovo 5 d. 10 val. 22:28 2010-03-05 22:28

Kiti klausimai apie žymes arba Užduoti klausimą