„Git Cherry-pick“ ir „Merge Workflow“

Darant prielaidą, kad esu repo rėmėjas, ir aš noriu padaryti pakeitimus iš dalyvio, yra keletas galimų darbo eigos:

  • cherry-pick kiekvieną iš konsolės pataisą (tvarka). Tokiu atveju git rašo įsipareigojimą, nesusijusį su nuotoliniu filialu.
  • merge filialą, traukiu visus pakeitimus ir pridedu naują „konfliktą“ (jei reikia).
  • merge kiekvieną nuotolinio filialo vaizdą atskirai (vėl tvarka), leidžiantį įrašyti kiekvieno įsipareigojimo konfliktus, o ne juos suskirstyti į vieną.
  • Išsamumo dėka, galite atlikti rebase (taip pat kaip ir cherry-pick variantą?), Bet suprantu, kad tai gali sukelti painiavą indėlininkui. Galbūt tai netaikoma 1 galimybei.

Abiem atvejais 2 ir 3, git rašo įsipareigojimų filialų istoriją, o ne 1.

Kas yra tarp ir tarp naudojimosi cherry-pick arba merge metodais? . Suprantu, kad 2 metodas yra norma, bet manau, kad didelio įsipareigojimo su vienu „konfliktu“ sprendimas yra ne pats švariausias sprendimas.

255
07 авг. nustatyti cmcginty 07 rug . 2009-08-07 00:50 '09 - 0:50 2009-08-07 00:50
@ 2 atsakymai

Tiek rebase (ir cherry-pick ), tiek merge turi privalumų ir trūkumų. Manau, kad čia yra merge , tačiau verta suprasti abu. (Ieškokite alternatyvaus, gerai pagrįsto atsakymo, nurodant atvejus, kai pirmenybė teikiama pirmenybei.)

merge geriau nei cherry-pick rebase ir rebase dėl kelių priežasčių.

  • šiurkštumas Fiksavimo identifikatorius SHA1 jį identifikuoja ne tik pats, bet ir visų kitų prieš tai buvusių įsipareigojimų atžvilgiu. Tai garantuoja, kad kapinyno būsena šioje SHA1 yra identiška visiems klonams. Yra (teoriškai) jokios galimybės, kad kažkas padarė kažką panašaus pakeitimo, bet iš tikrųjų iškreipia arba užfiksuoja jūsų saugyklą. Jūs galite pasirinkti vyšną atskiruose pokyčiuose, ir jie tikriausiai yra tokie patys, bet jūs neturite garantijos. (Kaip antrinė antrinė problema, naujai užfiksuotos vyšnios užims papildomą erdvę, jei kas nors dar kartą pasirinks vyšną toje pačioje komandoje, nes abu jie bus istorijoje, net jei jūsų darbo kopijos galiausiai sutaps.)
  • Lengva naudoti. Žmonės linkę lengvai suprasti darbo eigą. rebase paprastai yra laikomas labiau pažengusiu. Geriausia suprasti abu, bet žmonės, kurie nenori būti versijos kontrolės ekspertais (kurie, mano nuomone, įtraukė daugybę kolegų, kurie pasidžiaugė tuo, ką jie daro, bet nenori praleisti papildomo laiko), palengvina tiesiog susijungia.

Net jei susijungia su dideliais darbo rebase , rebase ir cherry-pick vis dar yra naudingi tam tikrais atvejais:

  • Vienas merge trūkumas yra netvarkinga istorija. rebase neleidžia išsklaidyti ilgos eilės rebase jūsų istorijoje, tarsi jūs periodiškai susijungėte į kitus pakeitimus. Tai yra jo pagrindinis tikslas, kai jį naudoju. Tai, kad norite būti labai atsargūs, niekada nenurodo rebase kodo, kurį bendrinate su kitomis saugyklomis. Nustačius push , kažkas galėtų tai padaryti, o perkrovimas geriausiu atveju sukels anksčiau aprašytą dubliavimą. Blogiausiu atveju gali būti labai susipainiojęs saugykla ir subtilios klaidos, kurios užima daug laiko.
  • cherry-pick yra naudinga pasirinkus nedidelį pakeitimų pogrupį iš temos temos, kurią iš esmės nusprendėte numesti, bet suprato, kad yra keletas naudingų fragmentų.

Kalbant apie daugelio pokyčių susijungimo prielaidą: daug lengviau. Po to, kai pradėsite daug jų, gali būti labai sunku sujungti atskirus pakeitimų rinkinius. Sujungimo raiška git (tiek Mercurial, tiek Bazaar) yra labai gera. Jūs neturėsite rimtų problemų, susijusių su net ilgų filialų sujungimu. Aš apskritai viską susijungiu vienu metu ir tik tada, kai gausiu daug konfliktų, grįžiu ir vėl pradėjau jungtis į dalis. Net tada aš tai darau dideliais gabalais. Kaip labai realus pavyzdys, turėjau kolegą, turinčią 3 mėnesių pakeitimų, kad galėčiau sujungti, ir apie 250 tūkst. Tai, ką mes padarėme, kad galėtume ištaisyti, yra vieni mėnesio vienijimas: konfliktai nedidėja tiesiškai ir rezultatas yra daug mažiau nei 9000 konfliktų. Tai vis dar buvo daug darbo, bet ne tiek, kiek bandė tai padaryti vienu metu.

246
07 авг. atsakymas pateikiamas kvarkas 07 rug. 2009-08-07 01:14 '09 ne 1:14 2009-08-07 01:14

Mano nuomone, vyšnių rinkimas turėtų būti rezervuojamas retoms situacijoms, kai to reikia, pavyzdžiui, jei atlikote kai kuriuos pataisymus tiesiogiai „magistro“ filiale (kamiene, pagrindiniame vystymo skyriuje) ir tada supratote, kad jis taip pat turėtų būti naudojamas „maint“ ". Darbo eigą turite susieti sujungimu arba perkrovimu (arba „git pull -rebase“).

Atminkite, kad pasirinktas vyšnios ar perskirstytas įsipareigojimas skiriasi nuo „Git“ (turi skirtingą SHA-1 identifikatorių), nei originalas, todėl jis skiriasi nuo įsipareigojimo nuotolinio saugykloje. (Rebase paprastai gali tai apdoroti, nes ji patikrina pleistro identifikatorių, t. Y. Keisti, o ne pataisymo identifikatorių).

Taip pat „Git“ galite sujungti kelis filialus vienu metu: vadinamasis aštuonkojai susilieja. Atkreipkite dėmesį, kad aštuonkojų susijungimas turi būti sėkmingas be konfliktų. Tačiau tai gali būti naudinga.

NTN.

84
08 авг. atsakymas, kurį pateikė Jakub Narębski 08 rug . 2009-08-08 15:22 '09 ne 15:22 2009-08-08 15:22

Kiti klausimai apie „ žymes „ arba „ Klauskite“