Kada koristite git rebase umjesto git stapanja?

Kada se preporučuje korištenje git rebase odnosu na git merge ?

Moram li se ponovno ujediniti nakon uspješnog ponovnog pokretanja?

1330
29 апр. Coocoo4Cocoa je definiran 29. travnja. 2009-04-29 23:26 '09 u 23:26 2009-04-29 23:26
@ 15 odgovora

Kratka verzija

  • Spajanje prihvaća sve promjene u jednoj grani i spaja ih u drugu granu u jednom urezivanju.
  • Rebase kaže da trebam točku u kojoj sam razgranat kako bih prešao na novu početnu točku.

Dakle, kada koristite jednu od njih?

spojiti

  • Pretpostavimo da stvorite granu za razvoj jedne funkcije. Kada želite vratiti te promjene na nadređeni, vjerojatno ćete trebati spajanje (ne želite sačuvati sve intermedije).

Rebase

  • Drugi scenarij bi bio da ste počeli raditi neki razvoj, a zatim je drugi programer napravio nepovezanu promjenu. Vjerojatno ćete htjeti izvaditi, a zatim rebase bazirati svoje promjene na trenutnoj verziji iz repoa.
1018
29 апр. Odgovor dao Rob Di Marco 29. travnja. 2009-04-29 23:38 '09 u 23:38 2009-04-29 23:38

Jednostavno je, s rebasom, kažete da koristite drugu granu kao novu bazu za vaš rad.

Ako imate, na primjer, master granu, a vi kreirate granu za implementaciju nove funkcije, recimo, vi to zovete " cool-feature , onda je, naravno, glavna grana osnova za vašu novu funkciju.

Sada u određenom trenutku želite dodati novu funkciju koju ste implementirali u master grani. Jednostavno se možete prebaciti na master i spajanje grane s cool-feature :

 $ git checkout master $ git merge cool-feature 

ali to dodaje novu lažnu obvezu, ako želite izbjeći povijest špageta, možete se preseliti :

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

i zatim spojite u master :

 $ git checkout master $ git merge cool-feature 

Ovaj put, budući da tematska nit ima isti glavni unos i izvršava s novom funkcijom, spajanje će jednostavno biti brzo premotano.

316
05 февр. odgovor je dao Aldo 'xoen' Giambelluca 5. veljače. 2012-02-05 09:28 '12 u 9:28 2012-02-05 09:28

Dopuniti svoj odgovor , naveden iz TSamper ,

  • repozicioniranje je često dobra ideja prije spajanja, jer je ideja da integrirate u svoju granu Y rad grane B , s kojom ćete se spojiti.
    Ali opet, prije spajanja, rješavate svaki sukob u svojoj grani (tj. "Ponovno", kao u "ponovite moj rad u mojoj grani, počevši od posljednje točke podružnice B )
    Ako se to učini ispravno, naknadno spajanje s vašom granom u granu B može biti brzo naprijed.

  • utjecaj spajanja izravno na odredišnu granu B , što znači da će spajanje biti više trivijalno, inače će granica B biti duga da bi se vratila u stabilno stanje (vrijeme kada riješite sve sukobe)


spojiti točku nakon ponovnog instaliranja?

U slučaju kada opisujem, ponovo instaliram B u svoju granu kako bih mogao reproducirati svoj rad iz kasnije točke iz B , ali ostajući u svojoj grani.
U ovom slučaju, spajanje je još uvijek potrebno kako bi moj "ponovni" rad na B

Drugi scenarij (na primjer, opisan u Git Ready- u) je da svoj posao prenesete izravno u B putem rebase (što štedi sva vaša dobra ili čak daje mogućnost da ih promijenite putem interaktivnog preusmjeravanja).
U tom slučaju (gdje ste ponovo instalirali, jer ste u grani B) u pravu ste: nije potrebno dodatno spajanje:

Zadano Git stablo kada se nismo spojili i ponovno izgradili

2019

258
29 апр. odgovor je dat VonC 29 apr. 2009-04-29 23:44 '09 u 23:44 2009-04-29 23:44

Mnogi od ovdje navedenih odgovora upućuju na to da spajanje pretvara sve vaše uloge u jednu i stoga predlaže korištenje rebase za spremanje vaših obveza. To je pogrešno. I loša ideja ako ste već napravili svoje obveze .

Spajanje ne uništava vaše obveze. Spajanje čuva povijest! (samo pogledajte gitk) Rebase prepisuje povijest, što je loša stvar nakon što ste je kliknuli.

Upotrijebite stopi - ne poništite ako ste već kliknuli.

Ovdje će preuzeti Linus (autorski git) . Stvarno je dobro čitati. Ili možete pročitati moju vlastitu verziju iste ideje u nastavku.

Vraćanje ogranaka na glavnom poslužitelju:

  • sadrži pogrešnu predodžbu o tome kako su stvorene obveze.
  • kontaminira majstora gomilom posrednih obveza koje možda nisu dobro testirane
  • uistinu mogu uvesti pauze za izgradnju ovih intermedijera zbog promjena koje su napravljene da bi se nosile s njima, kada je izvorna nit izrađena i kada je ponovno instalirana.
  • teško pronaći dobra mjesta u master postupku.
  • Uzrokuje da se vremenske oznake obvezuju da se ne podudaraju s njihovim kronološkim redoslijedom u stablu. Dakle, vidjet ćete da počini A prethodi fiksaciji B u masteru, ali je obvezu B prvi napisao autor. (Što?!)
  • To stvara više sukoba, jer pojedinačne obveze u tematskoj grani mogu uključivati ​​sukobe spajanja, koji se moraju pojedinačno riješiti (priča govori o tome što se dogodilo u svakoj transakciji).
  • - ponovno pisanje povijesti. Ako je grana za ponovno instaliranje bila pritisnuta negdje (dijeli se s nekim drugim nego s vama), onda ste oštetili svakoga tko ima tu granu otkad ste ponovno napisali priču.

Nasuprot tome, spajanje teme teme u masteru:

  • sprema povijest stvaranja niti, uključujući sva spajanja s olova na temu teme, kako bi ostala aktualna. Stvarno dobivate točnu predodžbu o tome s kojim je kodom programer radio pri izgradnji.
  • master je u osnovi grana za spajanje, a svaka od tih obveza spajanja obično su "dobri trenuci" u povijesti koji su sigurni za provjeru, jer gdje je grana teme spremna za integraciju.
  • pohranjuju se sve pojedinačne fiksacije teme teme, uključujući i činjenicu da su bile u temi teme, tako da je isticanje tih promjena prirodno i možete ga primijeniti gdje je to potrebno.
  • sukobi spajanja trebali bi se rješavati samo jednom (na točki spajanja), stoga se promjene među-urezivanja koje su napravljene u temama teme ne bi trebale rješavati neovisno.
  • može se obaviti nekoliko puta glatko. Ako integrirate ogranak teme za periodično osposobljavanje, ljudi mogu nastaviti graditi ogranak teme, a može se i dalje samostalno spajati.
161
04 февр. Odgovor daje Andrew Arnott 4. veljače. 2014-02-04 01:17 '14 u 1:17 2014-02-04 01:17

TL; DR

Ako sumnjate, upotrijebite spajanje.

Kratak odgovor

Jedine razlike između rebase i spajanja su:

  • Dobivena struktura stabala povijesti (u pravilu, vidljiva samo pri gledanju rasporeda fiksacije) razlikuje se (jedna ima grane, a druga nema).
  • Spajanje obično stvara dodatnu obvezu (na primjer, čvor u stablu).
  • Spajanjem i ponovnim instaliranjem različiti će se konflikti. Rebase će predstavljati sukobe koji se događaju u trenutku kada ih spajanje predstavlja sve odjednom.

Kratak odgovor je da odaberete rebase ili spajanje na temelju onoga što želite da vaša priča izgleda.

Dug odgovor

Prilikom odabira transakcije treba uzeti u obzir nekoliko čimbenika.

Je li affiliate koji vršite promjene s drugim programerima izvan vašeg tima (na primjer, open source, public)?

Ako da, nemojte ponovno instalirati. Rebase uništava granu, a ovi programeri će imati slomljena / nedosljedna spremišta ako ne koriste git pull --rebase . To je dobar način da brzo uznemirite druge programere.

Koliko je vaš tim za razvoj kvalificiran?

Rebase je destruktivno djelovanje. To znači da ako ga ne primijenite ispravno, možete izgubiti savršen rad i / ili prekinuti dosljednost drugih spremišta razvojnih programera.

Radila sam na timovima u kojima su svi programeri došli iz vremena kada su tvrtke mogle priuštiti posvećeno osoblje da se razgraniči i spoji. Ovi programeri znaju malo o Gitu i ne žele puno znati. U tim naredbama ne bih riskirao preporuku za ponovno podizanje sustava iz bilo kojeg razloga.

Je li nit sama korisna informacija?

Neke naredbe koriste model za svaku granu, gdje je svaka grana funkcija (ili popravak, ili pomoćna funkcija, itd.). U ovom modelu podružnica pomaže identificirati agregate povezanih obveza. Na primjer, možete brzo vratiti funkciju, vraćajući spajanje ove grane (pošteno, ovo je rijetka operacija). Ili usporedite funkciju uspoređujući dvije grane (općenitije). Rebase bi uništio granu i bilo bi teško.

Također sam radio na timovima koji su koristili model za svakog developera (svi smo bili tamo). U tom slučaju sama grana ne prenosi nikakve dodatne informacije (urezivanje već ima autora). Ne bi bilo štete kada se ponovno pokrene.

Možda želite iz bilo kojeg razloga vratiti spajanje?

Povrat (kao u slučaju otkaza) rebida znatno je složen i / ili nemoguć (ako je došlo do sukoba) u usporedbi s povratom spajanja. Ako mislite da postoji mogućnost da se želite vratiti, upotrijebite spajanje.

Radite li u timu? Ako je tako, pristajete li prihvatiti sve ili ništa na ovoj niti?

Operacije git pull --rebase pokretanja potrebno je izvući pomoću odgovarajućeg git pull --rebase . Ako radite samostalno, možete se sjetiti što biste trebali koristiti u odgovarajuće vrijeme. Ako radite u timu, bit će vrlo teško pomiriti se. To je razlog zašto većina radnih git pull --rebase rabata preporučuje korištenje git pull --rebase za sva git pull --rebase (i git pull --rebase za sve klikove).

Česti mitovi

Kombinirajte povijest uništavanja (squashes obvezuje)

Pod pretpostavkom da imate sljedeće spajanje:

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

Neki će ljudi istaknuti da spajanje "uništava" povijest urezivanja, jer ako morate pogledati dnevnik glavne grane (AD), propustit ćete važne poruke u B i C.

Da je tako, ne bismo imali ovakva pitanja . U principu, vidjet ćete B i C, osim ako ih izričito ne zamolite da ne vide (koristeći prvog roditelja). Vrlo je lako probati za sebe.

Rebase omogućuje sigurnije / jednostavnije spajanje

Oba se pristupa drukčije stapaju, ali nije jasno je li uvijek bolja od druge, a može ovisiti o tijeku rada razvojnog programera. Na primjer, ako programer nastoji napraviti redovito (na primjer, oni mogu obavljati dva puta dnevno kada se kreću od posla do kuće), onda može postojati mnogo obveza za određenu granu. Mnoge od tih obveza možda neće izgledati kao krajnji proizvod (sklon sam reorganizirati svoj pristup jednom ili dvaput po funkciji). Ako je netko drugi radio na srodnom području koda, a oni su pokušali promijeniti moje promjene, to može biti prilično zamorna operacija.

Ponovno hladnije / seksi / profesionalnije

Ako vam se sviđa pseudonim rm do rm -rf za "uštedu vremena", možda ćete morati ponovno instalirati.

Moja dva centa

Uvijek mislim da ću jednog dana naići na scenarij u kojem je Git rebase sjajan alat koji rješava problem. Kao što mi se čini, naletio sam na skriptu gdje je Git reflog odličan alat koji rješava moj problem. Već pet godina radim s Gitom. To se nije dogodilo.

Beskorisne priče za mene nikada nisu bile problem. Nikada nisam pročitao priču o izvršenju kao uzbudljiv roman. U većini slučajeva trebam priču, ali ću ipak koristiti w20> wame ili Git bisect. U ovom slučaju, prisustvo spajanja je stvarno korisno za mene, jer ako je spajanjem uveden problem koji ima značajne informacije za mene.

Ažuriranje (4/2017)

Osjećam se obaveznom spomenuti da sam osobno popustio kad sam koristio rebase, iako je moj opći savjet i dalje vrijedan toga. Nedavno sam mnogo interagirao s projektom Angular 2 Material . Koristili su rebase kako bi spasili vrlo čistu povijest popravaka. Zbog toga mi je bilo vrlo lako vidjeti da je ovaj nedostatak fiksiran i je li ta obveza uključena u objavu. Služi kao izvrstan primjer pravilnog korištenja prosljeđivanja poziva.

143
13 апр. odgovor dan Pace 13. \ t 2016-04-13 05:16 '16 u 17:16 2016-04-13 05:16

Spoji fondove: izradite novu novu obvezu koja spaja moje izmjene s odredištem.

Rebase znači: stvorite cijeli niz urezivanja koristeći moj trenutni skup urezivanja kao savjete. Drugim riječima, shvatite kako bi izgledale moje promjene ako bih ih počela raditi od trenutka kada ponovno izgradim. Stoga ćete nakon ponovne instalacije možda morati ponovno provjeriti promjene i tijekom ponovne instalacije možda ćete imati nekoliko sukoba.

S obzirom na to, zašto trebate ponovno instalirati? Samo u povijest razvoja bilo je jasno. Pretpostavimo da radite na funkciji X, a kad završite, spojite svoje promjene. Sada će primatelj imati jednu obvezu koja će reći nešto poput niza "Dodano funkcija X". Sada, umjesto spajanja, ako ponovo instalirate i spojite, povijest razvoja odredišta sadržavat će sve pojedinačne unose u jednu logičku progresiju. To uvelike olakšava analizu promjena. Zamislite kako biste mogli pronaći povijest razvoja, ako je 50 programera sve vrijeme kombiniralo različite funkcije.

Međutim, ako ste već kliknuli na granu na kojoj radite, ne biste trebali ponovo graditi, nego se spajati. Za grane koje nisu gurnute uzvodno, ponovno instalirajte, testirajte i stopite.

Drugi put, kada želite ponovno instalirati, morate se riješiti urezivanja iz vaše grane prije nego što kliknete gore. Na primjer: Urezuje, koji unosi neki kôd za otklanjanje pogrešaka u ranoj fazi, dok drugi bilježe da čisti ovaj kôd. Jedini način da to učinite je da izvršite interaktivni ponovno podizanje sustava: git rebase -i <branch/commit/tag>

UPDATE: Također želite koristiti rebase kada koristite Git za interakciju sa sustavom kontrole verzije koji ne podržava nelinearnu povijest (na primjer, ometanje rada). Kada koristite git -svn most, vrlo je važno da promjene koje ste spojili natrag u subverziju predstavljaju dosljedan popis promjena tijekom posljednjih promjena u deblu. To se može učiniti samo na dva načina: (1) Ručno ponovno stvaranje promjena i (2) Upotreba naredbe rebase, koja se izvodi mnogo brže.

UPDATE2: Još jedan način razmišljanja o preusmjeravanju je da vam omogućuje da uskladite izgled vašeg razvojnog stila sa stilom usvojenim u spremištu u koje se obvezujete. Neka se kaže da volite raditi malim sitnim komadima. Imate jedan popravak, popravak pogrešnog pisma, jedan popravak, uklanjanje neiskorištenog koda i tako dalje. Kada završite ono što trebate učiniti, imate dugi niz obveza. Dopustite mi da kažem da repozitorij koji ste odlučili potiče velike obveze, pa biste za posao koji radite očekivali jednu ili dvije obveze. Kako uzimati vašu obvezujuću liniju i komprimirati je na očekivanu? Vi biste koristili interaktivnu obradu i squash da bi se vaše sitne obveze pretvorile u manje komade. Isto vrijedi i ako je bilo potrebno obrnuto - ako je vaš stil bio nekoliko velikih obveza, ali repo je zahtijevao duge crte malih obveza. Također ćete koristiti rebase za to. Ako ste se spojili umjesto toga, sada ste premjestili svoj stil u glavno spremište. Ako postoje mnogi programeri, možete zamisliti kako bi bilo teško pratiti priču s nekoliko različitih stilova fiksacije nakon nekog vremena.

UPDATE3: Treba Does one still need to merge after a successful rebase? Da, da. Razlog tome je što rebid u osnovi uključuje "prebacivanje" obveza. Kao što sam rekao gore, ove se obveze izračunavaju, ali ako ste imali 14 obveza iz točke podružnice, onda, pod uvjetom da vaša transpozicija ne radi, bit ćete 14 počinili unaprijed (od trenutka kada ste ponovno postavili) nakon rebase je učinjeno. Imali ste granu prije ponovnog instaliranja. Nakon toga imat ćete granu iste duljine. Prije objavljivanja izmjena morate se udružiti. Drugim riječima, rebase toliko puta koliko želite (opet, samo ako niste gurnuli svoje promjene uzvodno). Объединяйте только после перезагрузки.

66
ответ дан Carl 05 февр. '12 в 9:47 2012-02-05 09:47