git rebase komento on maine maaginen Git voodoo, että aloittelijat pitäisi pysyä erossa, mutta se voi todella tehdä elämästä paljon helpompaa kehitystiimi, kun käytetään varoen. Tässä artikkelissa, me vertailla git rebase liittyvät git merge komento ja tunnistaa kaikkia mahdollisia tilaisuuksia rebasing osaksi tyypillinen Git työnkulun.,

Käsitteellistä Yleistä

ensimmäinen asia ymmärtää noin git rebase on, että se ratkaisee samaan ongelmaan kuin git merge. Molemmat komennot ovat suunniteltu yhdistää muutokset yhdestä haara toiseen haara—ne vain tekevät sen hyvin eri tavoin.

Mieti, mitä tapahtuu, kun alkaa työstää uutta ominaisuutta erillisessä haarassa, sitten toinen tiimin jäsen päivitykset master haara kanssa uuden sitoutuu. Tämä johtaa kaksihaarainen historia, jonka pitäisi olla tuttu kaikille, jotka on käyttää Git kuin yhteistyön välineenä.,

Nyt oletetaan, että uuden sitoutuu master ovat merkityksellisiä ominaisuus, joka olet työskennellyt. Sisällyttämään uuden sitoutuu omaan feature branch, sinulla on kaksi vaihtoehtoa: sulautuvan tai rebasing.,

Yhdistä-Vaihtoehto

helpoin vaihtoehto on yhdistää master haara osaksi kehityshaaran käyttäen jotain seuraavista:

git checkout feature git merge master

Tai, voit tiivistyä tämä yksi-liner:

 git merge feature master

Tämä luo uusi ”yhdistää sitoutua” feature haara, joka sitoo yhteen historia sekä oksat, antaa sinulle haara rakenne, joka näyttää tältä:

Yhdistäminen on mukavaa, koska se on ei-hajottava toiminta. Olemassa olevia konttoreita ei muuteta millään tavalla., Näin vältetään kaikki mahdolliset torjunnan sudenkuopat (käsitellään jäljempänä).

toisaalta, tämä tarkoittaa myös sitä, että feature branch on ylimääräisiä yhdistää tehnyt joka kerta sinun täytyy sisällyttää ylävirran muutokset. Jos master on hyvin aktiivinen, tämä voi saastuttaa ominaisuushaarasi historiaa melkoisesti. Vaikka tätä ongelmaa on mahdollista lieventää edistyneillä git log – vaihtoehdoilla, se voi tehdä muiden kehittäjien vaikeaksi ymmärtää projektin historiaa.,

Rebase Vaihtoehto

vaihtoehtona yhdistäminen, voit rebase feature branch päälle master haara käyttäen seuraavia komentoja:

git checkout feature git rebase master

Tämä siirtää koko feature sivuliike aloittaa kärki master branch, tehokkaasti, joissa kaikki uudet sitoutuu master. Mutta, sen sijaan, että käyttämällä merge sitoutua, rebasing uudelleen kirjoittaa hankkeen historiaa luomalla upouusi sitoutuu jokaisen sitoutua alkuperäinen haara.,

luopumisen suurin hyöty on se, että saat paljon puhtaamman projektihistorian. Ensinnäkin se poistaa git merge: n vaatimat tarpeettomat yhdistämissitoumukset. Toiseksi, kuten voitte nähdä edellä kaavion, rebasing johtaa myös täysin lineaarinen hankkeen historia—voit seurata kärki feature aina projektin alussa ilman haarukoita. Tämä helpottaa navigoida projektin kanssa komennot kuten git log, git bisect ja gitk.,

mutta, on olemassa kaksi kompromisseja tämän koskematon sitoutua historia: turvallisuus ja jäljitettävyys. Jos et noudata kultainen sääntö Uudelleenpoistaminen, uudelleen kirjoittaminen projektin historia voi olla mahdollisesti katastrofaalinen yhteistyö työnkulun. Ja yhtä tärkeää, rebasing menettää yhteydessä toimittamien yhdistää sitoutua—et voi nähdä, kun alkupään muutokset sisällytettiin ominaisuus.

Interaktiivinen Rebasing

Interactive rebasing antaa sinulle mahdollisuuden muuttaa sitoutuu, koska ne ovat muutti uusi haara., Tämä on jopa tehokkaampi kuin automatisoitu rebase, koska se tarjoaa täydellisen kontrollin branch on tehnyt historiaa. Tyypillisesti tätä käytetään sotkuisen historian siivoamiseen ennen ominaisuushaaran yhdistämistä master.,

aloita interaktiivinen rebasing istunto, siirtää i mahdollisuus git rebase komento:

git checkout feature git rebase -i master

Tämä avaa tekstieditori listalle kaikki sitoutuu siihen, että tietoja voidaan siirtää:

pick 33d5b7a Message for commit #1 pick 9480b3d Message for commit #2 pick 5c67e61 Message for commit #3

Tämä listaus määrittelee, mitä haara näyttää, kun rebase suoritetaan. Muuttamalla pick komento-ja/tai uudelleen tilaaminen merkinnät, voit tehdä haara historia näyttää, mitä haluat., Esimerkiksi, jos 2 tehnyt korjauksia pieni ongelma 1. commit, voit tiivistää ne yhdeksi commit fixup komento:

pick 33d5b7a Message for commit #1 fixup 9480b3d Message for commit #2 pick 5c67e61 Message for commit #3

Kun tallennat ja suljet tiedoston, Git suorittaa rebase mukaan ohjeet, jolloin hankkeen historiaa, joka näyttää seuraavalta:

Poistaa merkityksetön sitoutuu näin tekee ominaisuus on historiaa paljon helpompi ymmärtää. Tätä git merge ei yksinkertaisesti voi tehdä.,

Kultainen Sääntö Rebasing

Kun ymmärrät, mitä rebasing on tärkein asia oppia on, kun ei tehdä siitä. git rebase kultainen sääntö on, ettei sitä saa koskaan käyttää julkishallinnossa.

esimerkiksi, miettiä, mitä tapahtuisi, jos rebased master päälle feature branch:

rebase liikkuu kaikki sitoutuu master kiinni kärki feature. Ongelma on, että tämä tapahtui vain arkistossa., Kaikki muut kehittäjät työskentelevät edelleen alkuperäisen masterkanssa. Koska rebasing tulokset upouusi sitoutuu, Git ajattelee, että master branch historia on kulkenut toiseen suuntaan kuin muut.

ainoa tapa synkronoida kaksi master oksat on yhdistää ne takaisin yhteen, jolloin ylimääräinen yhdistää tehnyt ja kaksi sarjaa sitoutuu, jotka sisältävät samat muutokset (alkuperäisiä, ja niistä teidän rebased branch). On sanomattakin selvää, että tilanne on hyvin sekava.,

Joten, ennen kuin suoritat git rebase, aina kysy itseltäsi, ”Onko kukaan muu katselee tätä branch?”Jos vastaus on kyllä, ottaa kädet pois näppäimistön ja alkaa miettiä rikkomattomat tapa tehdä muutoksia (esim. git revert komento). Muuten voit kirjoittaa historiaa uudelleen niin paljon kuin haluat.

Voima-Työntämällä

Jos yrität työntää rebased master haara takaisin versiohallintaan, Git ei estä sinua tekemästä niin, koska se on ristiriidassa remote master branch., Mutta, voit pakottaa työntää läpi johtamalla --force lippu, kuten niin:

# Be very careful with this command! git push --force

Tämä korvaa kauko – master branch vastaamaan rebased yksi oman arkiston ja tekee asioita hyvin sekava loppuelämäsi joukkue. Joten, ole hyvin varovainen käyttää tätä komentoa vain, kun tiedät tarkalleen, mitä teet.

Yksi vain kertaa sinun pitäisi olla voima-pushing on, kun olet suoritetaan paikallis-siivous sen jälkeen, kun olet työntää oma ominaisuus haara kauko arkistoon (esim. varmuuskopiointia varten)., Tämä on kuin sanoisi: ”Hups, en oikeastaan halunnut työntää että alkuperäinen versio ominaisuus haara. Ota sen sijaan nykyinen.”Jälleen, on tärkeää, että kukaan ei toimi pois sitoutuu alkuperäisestä versiosta kehityshaaran.

Työnkulun Esittely

Rebasing voidaan sisällyttää osaksi olemassa Git työnkulun niin paljon tai niin vähän kuin joukkue on tyytyväinen. Tässä osiossa tarkastelemme etuja, joita rebasing voi tarjota eri vaiheissa ominaisuuden kehitystä.,

ensimmäinen askel tahansa työnkulun, joka hyödyntää git rebase on luoda erillinen haara kunkin ominaisuuden. Tämä antaa sinulle tarvittavat haara rakenne turvallisesti käyttää rebasing:

Paikallinen Siivous

Yksi parhaista tavoista sisällyttää rebasing osaksi työnkulkua on siivota paikallisella, in-progress ominaisuuksia. Suorittamalla ajoittain interaktiivisen uudelleenlaadinnan, voit varmistaa, että jokainen toimituksesi on keskittynyt ja mielekäs., Tämän avulla voit kirjoittaa oman koodin murehtimatta rikkomatta ylös eristetty sitoutuu—et voi korjata sitä jälkikäteen.

Kun soitat git rebase, sinulla on kaksi vaihtoehtoa uusi pohja: ominaisuus on vanhempi haara (esim. master), tai aikaisemmin tehnyt oman ominaisuus. Näimme esimerkin ensimmäisestä vaihtoehdosta interaktiivisessa Rebasing-osiossa. Jälkimmäinen vaihtoehto on mukava, kun sinun tarvitsee vain korjata viimeiset toimitukset. Esimerkiksi seuraava komento aloittaa interaktiivisen uudelleenasennuksen vain viimeisistä 3 toimituksesta.,

git checkout feature git rebase -i HEAD~3

määrittämällä HEAD~3 kuin uusi pohja, et liiku haara—olet vain vuorovaikutteisesti re-kirjoittaminen 3 sitoutuu siihen, että seuraa sitä. Huomaa, että tämä ei sisällä ylävirtamuutoksia feature haaraan.

Jos haluat uudelleen kirjoittaa koko ominaisuus käyttämällä tätä menetelmää, git merge-base komento voi olla hyödyllistä löytää alkuperäinen pohja feature branch., Seuraavat palaa commit ID alkuperäinen pohja, jonka voit sitten siirtää git rebase:

git merge-base feature master

Tämä interaktiivisten rebasing on hyvä tapa esitellä git rebase osaksi työnkulkua, koska se vaikuttaa vain paikallinen oksat. Muut kehittäjät näkevät vain valmiin tuotteesi, jonka pitäisi olla puhdas, helposti seurattava ominaisuushaarahistoria.

mutta jälleen, tämä toimii vain yksityisille feature-sivukonttoreille., Jos olet yhteistyötä muiden kehittäjien kautta sama ominaisuus haara, haara on julkinen, ja et saa kirjoittaa uudelleen historiansa.

ei ole git merge vaihtoehto siivota paikalliset toimitukset, joissa on interaktiivinen rebase.

Sisältää Ylävirran Muutokset Osaksi Ominaisuus

Käsitteellinen Yhteenveto-osassa näimme, kuinka kehityshaaran voi sisällyttää alkupään muutokset master joko git merge tai git rebase., Yhdistäminen on turvallinen vaihtoehto, joka säilyttää koko historia oman arkistossa, kun taas rebasing luo lineaarinen historia siirtämällä ominaisuus haara kiinni kärki master.

käyttö git rebase on samanlainen paikallinen uudelleenjärjestäminen (ja voidaan suorittaa samanaikaisesti), mutta tässä yhteydessä se sisältää ne alkupään sitoutuu alkaen master.

Pidä mielessä, että se on täysin laillista rebase päälle kauko-haara sijaan master., Tämä voi tapahtua, kun yhteistyötä sama ominaisuus, jossa toinen kehittäjä ja sinun täytyy sisällyttää niiden muutoksia omaan arkistoon.,

esimerkiksi, jos sinä ja toinen kehittäjä nimeltä John lisätty sitoutuu feature branch, arkiston voisi näyttää seuraavalta kun noudettaessa kauko – feature oksan John ’ s repository:

Voit ratkaista tämän haarukan täsmälleen samalla tavalla kuin olet integroida alkupään muutokset master: joko yhdistää paikalliseen feature john/feature, tai rebase paikalliseen feature kiinni kärki john/feature.,

Huomaa, että tämä rebase ei riko Kultainen Sääntö Rebasing koska vain paikalliseen feature sitoutuu siirretään—kaikki ennen sitä on koskematon. Tämä on kuin sanoisi: ”lisää muutokseni siihen, mitä John on jo tehnyt.”Useimmissa tapauksissa tämä on intuitiivisempaa kuin synkronointi etähaaran kanssa yhdistämistoimituksen kautta.

oletuksena git pull komento suorittaa yhdistämisen, mutta voit pakottaa se yhdistää kauko-haara, jossa on rebase siirtämällä se --rebase vaihtoehto.,

Tarkistaa Ominaisuus, Jossa on Pull-Pyyntö

Jos käytät vedä pyynnöt osana koodikatselmus prosessi, sinun täytyy välttää käyttämällä git rebase luomisen jälkeen vetää pyynnöstä. Heti kun teet pull-pyyntö, muut kehittäjät ovat katsomalla sitoutuu, mikä tarkoittaa, että se on julkinen haara. Uudelleen kirjoittaminen sen historia tekee mahdottomaksi Git ja joukkuetoverisi seurata mitään seuranta sitoutuu lisätty ominaisuus.

Mahdolliset muutokset muiden kehittäjien täytyy olla yhdistetty git merge sijaan git rebase.,

tästä syystä, se on yleensä hyvä idea siivota koodi interaktiivinen rebase ennen kuin lähetät vetää pyynnöstä.

Integrointi Hyväksytty Ominaisuus

sen Jälkeen, kun ominaisuus on hyväksynyt tiimisi, sinulla on mahdollisuus rebasing ominaisuus päälle kärki master branch, ennen kuin käytät git merge integroida ominaisuuden osaksi tärkein koodi pohja.,

Tämä on samanlainen tilanne sisältää ylävirran muutokset osaksi ominaisuus, haara, mutta sillä ei saa uudelleen kirjoittaa sitoutuu master haara, sinun täytyy lopulta käyttää git merge integroida ominaisuus. Kuitenkin, suorittamalla uudelleen ennen yhdistämistä, olet varma, että yhdistäminen lähetetään nopeasti, mikä johtaa täysin lineaariseen historiaan. Tämä antaa sinulle myös mahdollisuuden squash kaikki seurantatoimet lisätään aikana pull pyyntö.,

Jos et ole täysin tyytyväinen git rebase, voit aina suorittaa rebase väliaikainen haara. Näin, Jos vahingossa sotkea ominaisuuden historiaa, voit tarkistaa alkuperäisen haara ja yrittää uudelleen. Esimerkiksi:

git checkout feature git checkout -b temporary-branch git rebase -i master # git checkout master git merge temporary-branch

Tiivistelmä

Ja se on kaikki mitä todella tarvitsee tietää aloittaa rebasing oman oksat., Jos haluat mieluummin puhdas, lineaarinen historia vapaa tarpeettomia yhdistää sitoutuu, sinun pitäisi päästä git rebase sijaan git merge kun integrointi muutoksia toisesta haarasta.

toisaalta,, jos haluat säilyttää täydellisen historian projekti ja välttää riski, re-kirjoittaminen julkinen sitoutuu, voit kiinni git merge. Joko vaihtoehto on täysin pätevä, mutta ainakin nyt sinulla on mahdollisuus hyödyntämällä edut git rebase.