Pakartotinis „Git“ sujungimas

Aš turėjau problemą: aš turėjau 28s šaką tam tikram uždaviniui Gite, kurį aš bendrai vystiau. Pasirodo, kad aš tai padariau pernelyg greitai, todėl naudojosi git -revert, kad atšaukčiau susijungimą. Tačiau dabar atėjo laikas sujungti 28s vietas, tačiau git-merge komanda mato originalų susijungimą ir laimingai skelbia, kad viskas gerai ir filialai jau yra sujungti. Ką turėčiau daryti dabar? Sukurkite „Atkurti“ „Atkurti“ 28s → „plėtoti“? Atrodo, kad tai nėra geriausias būdas tai padaryti, bet šiuo metu negaliu įsivaizduoti kito.

Kaip atrodo medžio struktūra:

128
03 июля '09 в 10:15 2009-07-03 10:15 Toms Mikoss paprašė liepos 3, 09, 10:15 2009-07-03 10:15
@ 5 atsakymai

Turite „grįžti atgal“. Priklausomai nuo to, kaip tai padarėte, tai gali būti ne taip paprasta, kaip atrodo. Žr . Šio skyriaus oficialų dokumentą.

 ---o---o---o---M---x---x---W---x---Y / ---A---B-------------------C---D 

leisti:

 ---o---o---o---M---x---x-------x-------* / / ---A---B-------------------C---D 

Bet ar viskas veikia? Žinoma Galite grąžinti susijungimą, o iš grynai techninio kampo git tai padarė labai natūraliai ir neturėjo jokios realios problemos.
Jis tiesiog manė, kad tai yra perėjimas nuo „būsenos susiliejimas“ į „būsena po jungimo“, ir tai buvo taip. Niekas sudėtingas, nieko keisto, nieko tikrai pavojingo. „Git“ tai darys net nesuvokdamas.

Taigi, techniniu požiūriu, nėra nieko blogo, kai grįžtate į susijungimą, bet iš darbo eigos kampo būtent tai jūs turėtumėte pabandyti vengti .

Jei įmanoma, pavyzdžiui, jei radote problemą, susijusią su pagrindiniu medžiu , o ne grąžinti susijungimą, pabandykite :

  • problemą padalinkite į filialą, kurį sujungėte, ir tiesiog ją išspręskite,
  • arba pabandykite grąžinti individualią fiksaciją, kuri ją sukėlė.

Taip, tai yra sunkiau, ir ne, tai ne visada veiks (kartais atsakymas yra: „Oi, tikrai neturėjau nusausinti, nes jis vis dar nebuvo pasirengęs, ir man tikrai reikia atšaukti visą susijungimą“). Taigi jūs iš tikrųjų turėtumėte grąžinti susijungimą, bet, jei norite vėl sujungti susijungimą, dabar turite tai padaryti grąžindami grąžinimą.

103
03 июля '09 в 10:35 2009-07-03 10:35 atsakymą pateikė J-16 SDiZ liepos 03 '09, 10:35 2009-07-03 10:35

Tarkime, jūs turite tokią istoriją

 ---o---o---o---M---W---x-------x-------* / ---A---B 

Kur A, B nepavyko išspręsti, o W - grąžinti M

Taigi, prieš pradedant nustatyti problemas, kurias aš rasiu, aš pasirenku vyšnių pasirinkimą W mano filialui.

 git cherry-pick -x W 

Tada aš sugrįžsiu į W, padarytą ant mano gijos.

border=0
 git revert W 

Po to galiu tęsti pataisymą.

Paskutinė istorija gali atrodyti taip:

 ---o---o---o---M---W---x-------x-------* / / ---A---B---W---W`----------C---D 

Kai siunčiu PR, tai aiškiai parodys, kad PR atšaukia grąžinimą ir prideda naujus įsipareigojimus.

29
26 марта '13 в 23:21 2013-03-26 23:21 atsakymą pateikė Maksimas Kotlyaras kovo 26 d. 13 val. 23:21 2013-03-26 23:21

Norėdami grįžti atgal, ne per daug sukdami darbo eigą:

  • Sukurkite vietinę šiukšlių kopiją plėtrai.
  • Atšaukti pakartotinį įsipareigojimą vietinei kūrinio kopijai
  • Nukopijuokite šią kopiją į savo funkcijų šaką ir spustelėkite savo šakos funkciją savo git serveryje.

Dabar jūsų funkcijų filialas turėtų būti sujungtas kaip įprasta, kai būsite pasiruošę. Vienintelis trūkumas yra tai, kad jūsų istorijoje turėsite keletą papildomų susijungimų / pasikartojimų.

2
22 мая '17 в 21:32 2017-05-22 21:32 atsakymą davė Sam Dufel , gegužės 22 d. 17, 21:32

Užuot naudoję „ git-revert galite naudoti šią komandą krypties atšakoje, kad pašalintumėte (atšaukite) neteisingą sujungimo pataisą (vietoj tiesiog grąžinimo).

 git checkout devel git reset --hard COMMIT_BEFORE_WRONG_MERGE 

Atitinkamai jis taip pat koreguos darbo katalogo turinį. Būkite atsargūs :

  • Išsaugokite pakeitimus plėtros skyriuje (su neteisingu sujungimu), nes jie taip pat bus ištrinti naudojant git-reset . Visi prisiima po to, kai nurodysite, kaip git reset argumentas išnyks!
  • Taip pat nedarykite, jei pakeitimai jau buvo ištraukti iš kitų saugyklų, nes atstatymas perrašys istoriją.

Prieš bandant tai padaryti, rekomenduoju atidžiai peržiūrėti git-reset rankinį puslapį.

Dabar, iš naujo nustatę, galite iš naujo pritaikyti savo pakeitimus ir tada padaryti

 git checkout devel git merge 28s 

Tai bus tikras susiliejimas nuo 28s iki devel , kaip ir originalas (kuris dabar yra ištrintas iš git istorijos).

2
05 июля '09 в 17:29 2009-07-05 17:29 atsakymas suteiktas knweiss liepos 05 d. 09:17 val. 2009-07-05 17:29

Aš ką tik sužinojau, kad susidūriau su ta pačia problema. Manau, kad yra aukštesnis nei baisu, kad iš naujo nustatytu groteles ir tt Aš galiausiai pašalinsiu tai, ko nenoriu, ir negaliu grąžinti.

Vietoj to, aš patikrinau pataisą, norėjau, kad filialas sugrįžtų. git checkout 123466t7632723 . Tada jis konvertuojamas į „ git checkout my-new-branch filialą, git checkout my-new-branch . Tada ištrinau filialą, kuriame nebenorėjau. Žinoma, tai veiks tik tuomet, jei galėsite išmesti šaką, su kuria susidūrėte.

1
13 нояб. Atsakymą pateikė Nicola lapkričio 13 d. 2017-11-13 13:34 '17, 13:34 PM 2017-11-13 13:34

Kiti klausimai apie žymas arba Užduoti klausimą