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 master
kanssa. 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
.
Vastaa