„Git“ sujungimo atšaukimas

Atlikite šį atvejį:

Turiu tam tikrą darbą temos temoje ir dabar esu pasirengęs grįžti į kapitoną:

 * eb3b733 3 [master] [origin/master] | * b62cae6 2 [topic] |/ * 38abeae 1 

Aš sujungiu su kapitonu, išsprendžiu konfliktus ir dabar turiu:

 * 8101fe3 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] * | eb3b733 3 [origin/master] |/ * 38abeae 1 

Dabar susiliejimas užtruko šiek tiek laiko, todėl dar kartą pasirinksiu ir pastebiu, kad nuotolinio vedlio filialas turi naujus pakeitimus:

 * 8101fe3 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] | | * e7affba 4 [origin/master] | |/ |/| * | eb3b733 3 |/ * 38abeae 1 

Jei bandau „git rebase origin / master“ iš kapitono, turiu dar kartą išspręsti visus konfliktus ir taip pat prarasti sujungimo pataisą:

 * d4de423 2 [master] * e7affba 4 [origin/master] * eb3b733 3 | * b62cae6 2 [topic] |/ * 38abeae 1 

Ar yra švarus būdas iš naujo nustatyti susijungimo pataisą, todėl gaunu panašią istoriją, kaip parodysiu toliau?

 * 51984c7 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] * | e7affba 4 [origin/master] * | eb3b733 3 |/ * 38abeae 1 
134
24 янв. nustatė Jipumarino 24 Jan 2011-01-24 18:15 '11, 18:15, 2011-01-24 18:15
@ 5 atsakymai

Čia yra du variantai.

Vienas iš jų yra atlikti interaktyvų perkrovimą ir redaguoti susijungimo pataisymą, iš naujo sujungti rankiniu būdu ir tęsti perkrovimą.

Kitas yra naudoti „ -p parinktį „ git rebase , kuris aprašytas šiame vadove: „Užuot ignoravę susijungimus, pabandykite juos atkurti“. Šis klausimas taip pat paaiškina: ką daro „git“ nuolaidų išsaugojimo susiliejimas (ir kodėl?)

97
24 янв. atsakymą pateikė siridas Jan 24 2011-01-24 19:01 '11, 19:01, 2011-01-24 19:01

Gerai, kad senas klausimas ir jis jau priėmė atsakymą @siride , bet mano atsakyme šis atsakymas buvo nepakankamas, nes jėga @siride jums išspręsti visus konfliktus antrą kartą. Mano sprendimas grindžiamas @Tobi B idėja, bet su tiksliomis žingsninėmis instrukcijomis.

Taigi, mes pradėsime su šia būsena šiuo pavyzdžiu:

 * 8101fe3 Merge branch 'topic' [HEAD -> master] |\ | * b62cae6 2 [topic] | | | | * f5a7ca8 5 [origin/master] | | * e7affba 4 | |/ |/| * | eb3b733 3 |/ * 38abeae 1 
border=0

Atkreipkite dėmesį, kad priešais meistrą turime 2 tvirtinimus, todėl vyšnių rankena neveiks.

  • Visų pirma sukurkite mums reikalingą istoriją:

     git checkout -b correct-history # create new branch to save master for future git rebase -s ours -p origin/master 

    -p reiškia - --preserve-merges , mes naudojame jį išsaugoti sujungimo fiksaciją istorijoje. reikalinga tik gera istorija.

    Istorija atrodys taip (ignoruojant vedlį):

     * 51984c7 Merge branch 'topic' [HEAD -> correct-history] |\ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1 
  • Dabar nurodykite teisingą indeksą.

     git checkout master # return to our master branch git merge origin/master # merge origin/master on top of our master 

    Gali būti papildomų sujungimo konfliktų, tačiau tai bus tik konfliktai iš failų, pakeistų tarp 8101fe3 ir f5a7ca8 , bet neįtraukiant konfliktų, kurie jau buvo išspręsti iš topic

    Istorija atrodys taip (ignoruojant teisingą istoriją):

     * 94f1484 Merge branch 'origin/master' [HEAD -> master] |\ * | f5a7ca8 5 [origin/master] * | e7affba 4 | * 8101fe3 Merge branch 'topic' | |\ | | * b62cae6 2 [topic] |/ / * / eb3b733 3 |/ * 38abeae 1 
  • Paskutinis etapas yra suderinti mūsų filialą su teisinga istorija ir filialu su tinkamu indeksu.

     git reset --soft correct-history git commit --amend 

    Mes naudojame reset --soft kad atkurtume mūsų filialą (ir istoriją), kad ištaisytume istoriją, tačiau paliekame indeksą ir darbo medį kaip yra. Tada mes naudojame commit --amend - perrašyti mūsų susijungimą, kuris turėjo netinkamą indeksą, su mūsų geru pagrindiniu indeksu.

    Galų gale turėsime šią būseną (atkreipkite dėmesį į kitą viršutinio pataisymo ID):

     * 13e6d03 Merge branch 'topic' [HEAD -> master] |\ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1 
12
14 дек. Ivan Naydonov atsakymas gruodžio 14 d. 2017-12-14 20:13 '17, 8:13 PM 2017-12-14 20:13

Atsižvelgiant į tai, kad aš tiesiog praradau dieną, bandydama ją išsiaiškinti ir iš tikrųjų rasti sprendimą su kolegos pagalba, aš maniau, kad turėčiau paskambinti.

Turime didelę kodų bazę, ir turime spręsti 2 filialus, kurie tuo pačiu metu keičiasi. Yra pagrindinis filialas ir antrinis filialas, jei jūs.

Kol aš sujungiu antrinę šaką į pagrindinę šaką, darbas tęsiamas pagrindiniame filiale, ir iki jo pabaigos negaliu pakelti savo pakeitimų, nes jie yra nesuderinami.

Todėl turiu „iš naujo įdiegti“ savo „susijungimą“.

Taigi mes pagaliau tai padarėme:

1) atkreipkite dėmesį į SHA. Pavyzdys: c4a924d458ea0629c0d694f1b9e9576a3ecf506b

 git log -1 

2) Sukurkite teisingą istoriją, tačiau ji sulaužys susijungimą.

 git rebase -s ours --preserve-merges origin/master 

3) atkreipkite dėmesį į SHA. pavyzdys: 29dd8101d78

 git log -1 

4) Dabar iš naujo nustatykite, kur buvote anksčiau

 git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard 

5) Dabar sujunkite dabartinį kapitoną su savo darbo filialu.

 git merge origin/master git mergetool git commit -m"correct files 

6) Dabar, kai turite tinkamus failus, bet neteisingą istoriją, suraskite reikiamą istoriją savo pakeitimo viršuje:

 git reset 29dd8101d78 --soft 

7) Ir tada atšaukti rezultatus originalo įsipareigoti.

 git commit --amend 

Voila!

3
14 дек. Claude Peloquin atsakė į 14 d. 2017-12-14 19:47 '17, 7:47 pm 2017-12-14 19:47

Atrodo, kad norite ištrinti pirmąjį susijungimą. Galite atlikti šią procedūrą:

 git checkout master # Let make sure we are on master branch git reset --hard master~ # Let get back to master before the merge git pull # or git merge remote/master git merge topic 

Tai suteiks jums tai, ko norite.

1
24 янв. Atsakymą pateikė Antoine Pelisse Jan 24 2011-01-24 21:10 '11, 21:10, 2011-01-24 21:10
  • Nuo sujungimo fiksavimo
  • Vyšnios - pasirinkite naują pakeitimą, kuris turėtų būti lengvas.
  • nukopijuokite savo medžiagas.
  • dar kartą sujungti ir išspręsti konfliktus, tiesiog nukopijuodami failus iš vietinės kopijos;)
0
30 нояб. atsakymas pateikiamas Tobi B lapkričio 30 d. 2017-11-30 19:26 '17, 7:26 pm 2017-11-30 19:26