Kada naudojate „git rebase“, o ne „git“ susijungimą?

Kai rekomenduojama naudoti git rebase vs git merge ?

Ar man reikia vėl sujungti po sėkmingo perkrovimo?

1330 m
29 апр. „Coocoo4Cocoaapibrėžta balandžio 29 d. 2009-04-29 23:26 '09, 23:26 pm 2009-04-29 23:26
@ 15 atsakymų

Trumpas variantas

  • Sujungimas priima visus vieno filialo pakeitimus ir sujungia juos į kitą filialą vienoje.
  • Rebase sako, kad noriu pereiti prie naujo pradžios taško, kuriame aš esu šakotas.

Taigi, kada jūs naudojate vieną iš jų?

Sujunkite

  • Tarkime, jūs sukuriate filialą, kad sukurtumėte vieną funkciją. Jei norite grąžinti šiuos pakeitimus kapitonui, jums tikriausiai reikės sujungti (jums nereikia rūpintis visų tarpinių įrašų išsaugojimu).

Rebase

  • Antrasis scenarijus būtų, jei pradėjote daryti tam tikrą raidą, o kitas kūrėjas padarė nesusijusį pakeitimą. Jūs tikriausiai norėsite ištraukti ir perkelti, kad savo pakeitimus pamatytumėte iš dabartinės repo versijos.
1018
29 апр. Rob Di Marco atsakymas, pateiktas balandžio 29 d. 2009-04-29 23:38 '09, 23:38 PM 2009-04-29 23:38

Tai paprasta, su perskaičiavimu, jūs sakote, kad naudosite kitą filialą kaip naują savo darbo bazę .

Jei turite, pavyzdžiui, master filialą, ir kuriate filialą, kad galėtumėte įgyvendinti naują funkciją, tarkim, tai vadiname „ cool-feature , tada, žinoma, pagrindinis filialas yra jūsų naujos funkcijos pagrindas.

Dabar tam tikru momentu norite pridėti naują funkciją, kurią master filiale. Galite tiesiog pereiti prie master ir sujungti filialą su cool-feature :

 $ git checkout master $ git merge cool-feature 

tačiau tai prideda naują netikrą įsipareigojimą, jei norite išvengti spageti istorijos, galite perkelti :

border=0
 $ git checkout cool-feature $ git rebase master 

ir tada sujungti jį į master :

 $ git checkout master $ git merge cool-feature 

Šį kartą, kadangi temos sriegis turi tą patį kapitoną, jis įsipareigoja ir įsipareigoja vykdyti naują funkciją, todėl susijungimas bus tiesiog greitas.

316
05 февр. atsakymą pateikė Aldo 'xoen' Giambelluca 05 vasaris. 2012-02-05 09:28 '12 at 9:28 2012-02-05 09:28

Norėdami papildyti savo atsakymą , paminėtą iš TSamper ,

  • perskirstymas dažnai yra gera idėja prieš susijungimą, nes idėja yra ta, kad jūs integruojate į savo filialą B filialo B , su kuriuo sujungsite.
    Bet dar kartą, prieš sujungdami, išsprendžiate bet kokį jūsų filialo konfliktą (t. Y. „Rebase“, kaip ir „pakartokite savo darbą mano filiale, pradedant nuo paskutinio B filialo taško“
    Jei tai daroma teisingai, vėlesnis susiliejimas su filialu į filialą B gali būti greitas į priekį.

  • jungimo poveikis tiesiai į paskirties filialą B , o tai reiškia, kad susijungimas bus trivialesnis, nes priešingu atveju B skyrius gali būti ilgas, kad sugrįžtų į stabilią būseną (laikas, kai išsprendžiate visus konfliktus)


sujungti tašką po įdiegimo?

Tuo atveju, kai aš aprašysiu, aš iš naujo įdiegiu „ B į mano filialą, kad galėčiau atgaminti savo darbą iš vėlesnio taško iš „ B , bet likti mano filiale.
Tokiu atveju susijungimas vis dar yra būtinas, kad mano „pakartotinis“ darbas su B

Kitas scenarijus (pvz., Aprašytas „Git Ready“ ) yra jūsų darbas tiesiogiai perkelti į „ B per perkrovimą (kuris taupo visus jūsų gerus įsipareigojimus arba netgi suteikia galimybę jas perorganizuoti per interaktyvų nukreipimą).
Tokiu atveju (kai jūs iš naujo įdiegiate, būdamas B filialas) esate teisus: nereikia tolesnio sujungimo:

Numatytasis „Git“ medis, kai mes nesujungėme ir nesukuriame

2019

258
29 апр. atsakymas pateikiamas VonC 29 balandžio. 2009-04-29 23:44 '09, 23:44 PM 2009-04-29 23:44

Daugelis čia pateiktų atsakymų rodo, kad susiliejimas paverčia visus jūsų įsipareigojimus į vieną, ir todėl siūlo naudoti atkūrimą, kad išsaugotumėte savo įsipareigojimus. Tai neteisinga. Ir bloga idėja, jei jau padarėte savo įsipareigojimus .

Susijungimas nepanaikina jūsų įsipareigojimų. „Merge“ taupo istoriją! (tiesiog pažiūrėkite į „gitk“) „Rebase“ perrašo istoriją, kuri yra bloga po to, kai jį spustelėjote.

Naudokite sujungimą - ne perkelkite, jei jau spustelėjote.

Čia perims Linus (autoriaus git) . Labai gerai skaityti. Arba galite perskaityti savo paties tos pačios idėjos versiją.

Atkurti pagrindinio serverio filialus:

  • yra klaidinga nuomonė apie tai, kaip buvo sukurti įsipareigojimai.
  • užteršia laivo kapitoną su daugybe tarpinių įsipareigojimų, kurie gali būti netikrinti
  • gali iš tikrųjų įvesti šių tarpinių įsipareigojimų pertraukas dėl pakeitimų, kurie buvo atlikti, kad susidarytų tarp jų, kai buvo sukurtas originalus siūlas ir kada jis buvo iš naujo įdiegtas.
  • sunku rasti gerų vietų pagrindinėje procedūroje.
  • Laiko žymos įsipareigoja nesutapti su chronologine tvarka medyje. Taigi, pamatysite, kad įvykis A prieš B fiksavimą kapitale, bet įsipareigojimas B pirmą kartą buvo parašytas autoriaus. (Kas?!)
  • Tai sukuria daugiau konfliktų, nes individualūs įsipareigojimai teminėje šakoje gali apimti sujungimo konfliktus, kurie turi būti sprendžiami atskirai (pasakojama apie tai, kas įvyko kiekviename sandoryje).
  • - istorijos perrašymas. Jei filialas, kurį reikės įdiegti iš naujo, buvo kažkur paspaudžiamas (dalijamasi su kitu, nei sau), tada jūs sugadinote visus, kurie turi šį filialą, nes perrašėte istoriją.

Priešingai, temos temos sujungimas į magistralę:

  • taupo istoriją, kur buvo sukurtos temos, įskaitant bet kokią susijungimą nuo vadovo iki temos temos, kad ji būtų srovė. Jūs tikrai gausite tikslią idėją apie tai, kokį kodą kūrėjas sukūrė.
  • Meistras iš esmės yra susiliejimo filialas, ir kiekvienas iš šių junginių paprastai yra „geras akimirkas“ istorijoje, kurios gali būti patikimos, nes kur temos filialas buvo pasirengęs integracijai.
  • išsaugomi visi teminės temos įrašai, įskaitant tai, kad jie buvo temos temoje, todėl šių pakeitimų išryškinimas yra natūralus, ir, jei reikia, galite jį naudoti.
  • konfliktų sujungimas turėtų būti išspręstas tik vieną kartą (susijungimo taške), todėl tarpiniai temos siūlų pakeitimai neturėtų būti sprendžiami atskirai.
  • galima padaryti kelis kartus sklandžiai. Jei integruojate teminį skyrių periodiniam mokymui, žmonės gali toliau kurti temos filialą ir toliau gali būti sujungti atskirai.
161
04 февр. Atsakymą pateikė Andrew Arnott , vasario 4 d. 2014-02-04 01:17 '14 ne 1:17 2014-02-04 01:17

Tl; DR

Jei abejojate, naudokite susijungimą.

Trumpas atsakymas

Vieninteliai skirtumai tarp perskyrimo ir sujungimo yra:

  • Gauta medžių struktūra (paprastai pastebima tik peržiūrint fiksavimo grafiką) skiriasi (vienas turi filialų, o kitas - ne).
  • Paprastai sujungimas sukuria papildomą įvykį (pvz., Medyje esantis mazgas).
  • Susijungimas ir pakartotinis diegimas spręs skirtingus konfliktus. „Rebase“ atspindės konfliktus, kurie atsiranda tuo metu, kai susijungimas juos pateikia vienu metu.

Taigi, trumpas atsakymas yra pasirinkti perkelti ar sujungti, remiantis tuo, ką norite, kad jūsų istorija būtų panaši.

Ilgas atsakymas

Pasirenkant naudojamą sandorį reikia atsižvelgti į keletą veiksnių.

Ar filialas, kurį keičiate, su kitais kūrėjais, esančiais už savo komandos ribų (pvz., Atviro kodo, viešas)?

Jei taip, iš naujo neįdiegti. „Rebase“ sunaikina filialą, ir šie kūrėjai turės sugadintas / nenuoseklias saugyklas, jei jos nenaudos „ git pull --rebase . Tai geras būdas greitai sutrikdyti kitus kūrėjus.

Kaip kvalifikuota yra jūsų vystymo komanda?

Rebase yra destruktyvi operacija. Tai reiškia, kad netinkamai jį pritaikius, galite prarasti tobulą darbą ir / arba nutraukti kitų kūrėjų saugyklų nuoseklumą.

Dirbu komandose, kuriose kūrėjai visi atėjo iš to laiko, kai įmonės galėjo sau leisti savo darbuotojams įdarbinti ir jungtis. Šie kūrėjai mažai žino apie „Git“ ir nenori žinoti daug. Šiose komandose nekeltų pavojaus rekomenduoti perkrauti bet kokią priežastį.

Ar siūlai yra naudinga informacija?

Kai kurios komandos naudoja modelį kiekvienam filialui, kur kiekvienas filialas yra funkcija (arba pataisa, pagalbinė funkcija ir tt). Šiame modelyje filialas padeda nustatyti susijusių įsipareigojimų suvestines. Pavyzdžiui, galite greitai grąžinti funkciją, sugrąžindami šio filialo susijungimą (sąžiningai, tai retas veiksmas). Arba palyginkite funkciją lyginant du filialus (bendresnius). Rebase sugriautų šaką, ir tai būtų sunku.

Aš taip pat dirbau komandose, kurios naudojo modelį kiekvienam kūrėjui (mes visi buvome ten). Šiuo atveju pati filialas neperduoda jokios papildomos informacijos (įsipareigojimas jau turi autorių). Perkraunant nebūtų jokios žalos.

Galbūt norėsite grąžinti susijungimą dėl bet kokios priežasties?

Grįžimas (kaip ir atšaukimo atveju) yra labai sudėtingas ir (arba) neįmanomas (jei pertrauka turėjo konfliktų), palyginti su grąžinimo grįžimu. Jei manote, kad yra tikimybė, kad norite grįžti, naudokite susijungimą.

Ar dirbate komandoje? Jei taip, ar sutinkate sutikti su visa ar nieko šiuo klausimu?

Perkrauti operacijas reikia ištraukti naudodami atitinkamą git pull --rebase . Jei dirbate savarankiškai, galite prisiminti, ką turėtumėte naudoti tinkamu laiku. Jei dirbate komandoje, bus labai sunku suderinti. Štai kodėl daugelis nuolaidų darbo srautų rekomenduoja naudoti visus susijungimus (ir visoms paspaudimams git pull --rebase ).

Bendrieji mitai

Sujunkite sunaikinimo istoriją (skvošas)

Darant prielaidą, kad turite tokį sujungimą:

  B -- C / \ A--------D 

Kai kurie žmonės nurodys, kad sujungimas „sunaikina“ įsipareigojimo istoriją, nes jei jūs turite pažvelgti į tik pagrindinio filialo (AD) žurnalą, praleisite svarbius B ir C įrašus.

Jei taip būtų, neturėtume tokių klausimų . Iš esmės jūs pamatysite B ir C, nebent jūs aiškiai paprašytumėte jų nematyti (naudojant pirmąjį tėvą). Labai lengva pabandyti patys.

„Rebase“ leidžia saugiau ir paprastiau jungtis

Abu metodai sujungiami skirtingai, tačiau neaišku, ar jis visada yra geresnis nei kitas, ir tai gali priklausyti nuo kūrėjo darbo eigos. Pavyzdžiui, jei kūrėjas linkęs reguliariai dirbti (pavyzdžiui, jie gali atlikti du kartus per dieną, kai persikelia iš darbo į namus), tuomet gali būti, kad tam tikras filialas įsipareigoja. Daugelis šių įsipareigojimų negali atrodyti kaip galutinis produktas (aš linkiu reorganizuoti savo požiūrį vieną ar du kartus per funkciją). Jei kažkas dirbo susijusioje kodo srityje, ir jie bandė pakeisti savo pakeitimus, tai gali būti gana varginantis veiksmas.

Rebase šaltesnis / seksualesnis / profesionalesnis

Jei jums patinka alias rm į rm -rf „sutaupyti laiko“, gali tekti iš naujo įdiegti.

Mano du centai

Aš visada manau, kad kažkada aš susidursiu su scenarijumi, kai „Git rebase“ yra puikus įrankis, kuris išsprendžia problemą. Man atrodo, kad bėgo į scenarijų, kur Git reflog yra puiki priemonė, kuri išsprendžia mano problemą. Dirbu su „Git“ jau daugiau nei penkerius metus. Tai neįvyko.

Nenaudingos istorijos niekada nebuvo man problema. Aš niekada neskaito nusikaltimo istorija kaip įdomus romanas. Daugeliu atvejų man reikia istorijos, aš vis tiek naudosiu w20> wame arba Git bisect. Šiuo atveju susijungimo buvimas man tikrai naudingas, nes jei susijungimas sukėlė problemą, turinčią svarbią informaciją man.

Atnaujinti (4/2017)

Manau, kad privalau paminėti, kad aš asmeniškai palikiau naudodamasis perskaičiavimu, nors ir mano bendras patarimas yra verta. Neseniai su „ Angular 2 Material“ projektu daug bendrau . Jie naudojo perkrovimą, kad išsaugotų labai švarią fiksavimo istoriją. Dėl to man labai lengva pamatyti, kad šis defektas buvo nustatytas ir ar šis įsipareigojimas buvo įtrauktas į spaudai. Jis yra puikus pavyzdys, kaip tinkamai naudoti skambučių peradresavimą.

143
13 апр. atsakymas duotas Pace 13 Bal 2016-04-13 05:16 '16 at 17:16 pm 2016-04-13 05:16

Sujungti fondus: sukurkite naują naują įsipareigojimą, kuris sujungia mano pakeitimus į paskirties vietą.

„Rebase“ reiškia: sukurkite visą eilę įsipareigojimų, naudodamas mano dabartinį įvykių rinkinį kaip patarimus. Kitaip tariant, išsiaiškinkite, kaip atrodys mano pakeitimai, jei pradėjau juos daryti nuo to momento, kai aš atkursiu. Todėl, iš naujo įdiegus, gali tekti iš naujo patikrinti savo pakeitimus ir per įdiegimą iš naujo gali kilti keli konfliktai.

Atsižvelgiant į tai, kodėl jums reikia iš naujo įdiegti? Tiesiog į raidos istoriją buvo aišku. Tarkime, kad dirbate su X funkcija, ir kai baigsite, sujungsite pakeitimus. Dabar gavėjas turės vieną įsipareigojimą, kuris pasakys kažką panašaus į eilutę „Pridėta funkcija X“. Dabar vietoj susijungimo, jei jūs iš naujo įdiegsite ir tada sujungiate, tikslo raidos istorijoje bus visi atskiri asmenys, atliekantys vieną loginę pažangą. Tai labai palengvina pokyčių analizę. Įsivaizduokite, kaip galėtumėte ją pamatyti, kad pamatytumėte vystymosi istoriją, jei 50 kūrėjų visą laiką derins skirtingas funkcijas.

Tačiau, jei jau spustelėjote filialą, kuriame dirbate, neturėtumėte atstatyti, o vietoj to sujungti. Filialams, kurie nebuvo stumti į viršų, iš naujo įdiegti, išbandyti ir sujungti.

Dar kartą, kai norite įdiegti iš naujo, prieš paspaudę turite atsikratyti savo filialo įsipareigojimų. Pavyzdžiui: Įsipareigojimai, kurie ankstyvame etape įveda kai kuriuos derinimo kodus, o kiti registruoja, kad jie išvalo šį kodą. Vienintelis būdas tai padaryti yra atlikti interaktyvų perkrovimą: git rebase -i <branch/commit/tag>

UPDATE: Jūs taip pat norite naudoti „rebase“, kai naudojate „Git“, kad galėtumėte bendrauti su versijos valdymo sistema, kuri nepalaiko nelinijinės istorijos (pvz., Trikdančios operacijos). Naudojant „git -svn“ tiltą, labai svarbu, kad pakeitimai, kuriuos sujungėte atgal į subversion, yra nuoseklus paskutinių pakeitimų, susijusių su paskutiniais pakeitimais, sąrašas. Tai galima padaryti tik dviem būdais: (1) Rankiniu būdu iš naujo sukurkite pakeitimus ir (2) naudokite perkrovimo komandą, kuri veikia daug greičiau.

UPDATE2: dar vienas būdas pagalvoti apie peradresavimą yra tai, kad leidžia suderinti savo stiliaus išvaizdą su saugykloje priimtu stiliumi. Sakykime, kad jums patinka atlikti mažais mažais gabalais. Turite vieną pataisą, kad išspręstumėte klaidą, vieną pataisą, kad atsikratytumėte nepanaudoto kodo ir pan. Baigę tai, ką jums reikia padaryti, turite daug įsipareigojimų. Dabar leiskite man pasakyti, kad saugykla, kurią jūs įsipareigojate, skatina didelius įsipareigojimus, taigi, atlikdami darbą, jūs tikitės vieno ar dviejų įsipareigojimų. Kaip laikytis savo įsipareigojimo eilutės ir suspausti ją tikėtasi? Jūs naudosite interaktyvų apdorojimą ir skvošą, kad jūsų mažytė padėtų paversti mažesniais gabalais. Tas pats pasakytina, jei reikia atvirkštinio - jei jūsų stilius buvo nedidelis, tačiau repo reikėjo ilgų mažų įsipareigojimų. Šiam tikslui taip pat naudosite „rebase“. Jei vietoj to susijungėte, dabar perkėlėte savo įsipareigojimų stilių į pagrindinę saugyklą. Jei yra daug kūrėjų, galite įsivaizduoti, kaip sunku sekti istoriją su keliais skirtingais fiksavimo stiliais.

UPDATE3: Does one still need to merge after a successful rebase? Taip, taip. Priežastis yra ta, kad pakartotinis draudimas yra susijęs su „perjungimu“. Kaip jau minėjau, šie įsipareigojimai yra apskaičiuojami, tačiau, jei turėjote 14 įsipareigojimų iš filialo taško, tada, jei jūsų perkėlimas neveiks, jums bus 14 įsipareigojimų (nuo to momento, kai iš naujo nustatysite) po to, kai bus grąžinta yra padaryta. Prieš iš naujo įdiegėte filialą. Po to turėsite tokio pat ilgio filialą. Prieš paskelbdami pakeitimus, vis dar reikia susitarti. Kitaip tariant, perkelkite tiek kartų, kiek norite (dar kartą, tik jei nepakeitėte savo pakeitimų į viršų). Sujungti tik po perkrovimo.

66
05 февр. atsakymą pateikė Carl 05 vasaris. 2012-02-05 09:47 '12 at 9:47 2012-02-05 09:47