Kuinka (ja miksi!) Pitää Git-sitoutumishistoriasi puhtaana

Sitoumukset ovat yksi Git-arkiston keskeisistä osista, ja vielä enemmän, sitoutumisviesti on arkiston elämänloki. Kun projekti / arkisto kehittyy ajan myötä (uusia ominaisuuksia lisätään, virheitä korjataan, arkkitehtuuria uudistetaan), sitoutumisviestit ovat paikka, josta voi nähdä, mitä muutettiin ja miten. Joten on tärkeää, että nämä viestit heijastavat taustalla olevaa muutosta lyhyellä ja tarkalla tavalla.

Miksi mielekäs Git-sitoutumishistoria on tärkeä

Mitä Git-sitoutuminen tekee? ovat sormenjälkiä, jotka jätät koskettamallesi koodille. Mikä tahansa koodi, jonka annat tänään, vuoden kuluttua, kun tarkastelet samaa muutosta; olisit kiitollinen kirjoittamastasi selkeästä, mielekkäästä sitoutumisviestistä, ja se tulee myös olemaan helpottaa muiden kehittäjien elämää. Kun sitoumukset eristetään kontekstin perusteella, tietyn sitoutuneen virheen löytäminen on nopeampi löytää, ja sitä helpompaa on palauttaa vian aiheuttanut sitoutuminen.

Työskentellessämme suuressa projektissa käsittelemme usein monia liikkuvia osia, jotka päivitetään, lisätään tai poistetaan. Varmistusviestien ylläpidon varmistaminen tällaisissa tapauksissa voi olla hankalaa, varsinkin kun kehitys kestää useita päiviä, viikkoja tai jopa kuukausia. Joten yksinkertaistamaan pyrkimyksiä pitää ytimekäs Sitoumushistoria, tässä artikkelissa käytetään joitain yleisiä tilanteita, joita kehittäjä voi kohdata työskennellessään Git-arkistossa.

  • Tilanne 1: Minun on muutettava viimeisintä sitoutumista
  • Tilanne 2: Minun on muutettava tiettyä sitoutumista
  • Tilanne 3: Minun on lisättävä, poistettava tai yhdistettävä sitoumuksia
  • Tilanne 4: Sitoumushistoriani ei tee mielestäni tarvitsen uuden alun!

Mutta ennen kuin sukelamme sisään, käymme nopeasti läpi, miltä tyypillinen kehitystyönkulku näyttää hypoteettisessa Ruby-sovelluksessamme.

Huomaa: Tässä artikkelissa oletetaan, että olet tietoinen Gitin perusteista, kuinka haarat toimivat, kuinka lisätä haaran sitomattomat muutokset vaiheisiin ja miten muutokset tehdään. Jos et ole varma näistä virroista, dokumentaatiomme on hyvä lähtökohta.

Päivä elämässä

Täällä työskentelemme pienessä Ruby on Rails -projektissa, jossa sinun on lisättävä etusivulle navigointinäkymä, johon sisältyy useiden tiedostojen päivittäminen ja lisääminen. Seuraava on vaiheittainen erittely koko prosessista:

  • Aloitat työskennellä ominaisuuden kanssa päivittämällä tiedosto ; kutsu sitä nimellä application_controller.rb
  • Tämä ominaisuus edellyttää, että päivität myös näkymän: index.html.haml
  • Lisäsit osaston, jota käytetään hakemistosivulla: _navigation.html.haml
  • Myös sivun tyylit on päivitettävä lisäämäsi osion mukaan: styles.css.scss
  • Ominaisuus on nyt valmis tarvittavilla muutoksilla, aika päivittää myös testit; päivitettävät tiedostot ovat seuraavat:
    • application_controller_spec.rb
    • navigation_spec.rb
  • Testit päivitetään ja läpäistään odotetusti, nyt on aika tehdä muutokset!

Koska kaikki tiedostot kuuluvat arkkitehtuurin eri alueille, sitoudumme muutokset erotettu toisistaan sen varmistamiseksi, että jokainen sitoutuminen edustaa tiettyä kontekstia ja tehdään tietyssä järjestyksessä. Pidän yleensä parempana backend – > käyttöliittymäjärjestystä, jossa suurin osa taustakeskeisistä muutoksista tehdään ensin, sen jälkeen keskikerros ja sitten käyttöliittymäkeskeiset muutokset Git-luettelossa. >

Nyt kun muutoksemme on tehty, luomme yhdistämispyynnön haaran kanssa. Kun sulautuspyyntö on auki, vertaisarvioijasi tarkistaa sen yleensä ennen muutosten yhdistämistä repo ”s master -haaraan. Anna nyt oppia, mihin erilaisiin tilanteisiin voimme päätyä koodin tarkistuksen aikana.

Tilanne 1: Minun on muutettava viimeisin sitoutuminen

Kuvittele tapaus, jossa tarkistaja katsoi styles.css.scss ja ehdotti muutosta. Tällöin muutoksen tekeminen on hyvin yksinkertaista, koska tyylitaulukon muutokset ovat osa haarasi viimeistä sitoutumista. Näin voimme käsitellä tätä;

  • Teet tarvittavat muutokset suoraan sivuliikkeen styles.css.scss -sivulle.
  • kerran olet tehnyt muutokset, lisää nämä muutokset vaiheeseen; run git add styles.css.scss.
  • Kun muutokset on suoritettu, meidän on lisättävä nämä muutokset viimeiseen sitoutumiseen; run git commit --amend.
    • Komentojen erittely: Tässä pyydämme git commit -komentoa muuttamaan mitä tahansa muutoksia vaihe viimeisimpään sitoutumiseen.
  • Tämä avaa viimeisen sitoutumisen Git-määritellyssä tekstieditorissa, jossa on sitoutumisviesti Lisää tyylejä navigointia varten.
  • Koska päivitimme vain CSS-ilmoituksen, meidän ei tarvitse muuttaa sitoutumisviestiä.Tässä vaiheessa voit vain tallentaa ja poistua tekstieditorista, jonka Git avasi sinulle, ja muutokset näkyvät sitoutumisessa.

Koska muokkait olemassa olevaa sitoutumista, nämä muutokset vaaditaan pakotetaan työntämään kauko-repoosi käyttämällä git push --force-with-lease <remote_name> <branch_name>. Tämä komento ohittaa sitoutumisen Add styles for navigation etärepossa päivitetyllä sitoutumisella, jonka teimme juuri paikallisessa repossa.

Yksi asia, joka on pidettävä mielessä pakottaen työntämään haaroja on se, että jos työskentelet samalla haaralla useiden ihmisten kanssa, voiman työntäminen voi aiheuttaa ongelmia muille käyttäjille, kun he yrittävät normaalisti työntää muutoksensa etäisillä haaroilla, joille uusi voimansiirto on pakotettu. Käytä siis tätä ominaisuutta viisaasti. Voit oppia lisää Git-voimansiirtovaihtoehdoista täältä.

Tilanne 2: Minun on muutettava tiettyä sitoutumista

Edellisessä tilanteessa korjaus oli melko yksinkertainen, koska meidän oli muokattava vain viimeinen Git-sitoumuksemme, mutta kuvittele, jos arvostelija ehdottaa jotain muuttamista kohdassa _navigation.html.haml. Tässä tapauksessa se on toinen sitoutuminen ylhäältä, joten sen muuttaminen ei tule olemaan yhtä suoraa kuin se oli ensimmäisessä tilanteessa. Katsotaanpa, miten voimme hoitaa tämän:

Aina kun sitoutuminen on haarassa tehty, se tunnistetaan ainutlaatuisella SHA1-hash-merkkijonolla. Ajattele sitä ainutlaatuisena tunnuksena, joka erottaa yhden sitoutumisen toisesta. Voit tarkastella kaikkia suorituksia yhdessä niiden haarassa olevien SHA1-tiivisteiden kanssa suorittamalla git log. Tällöin näet lähdön, joka näyttää jonkin verran seuraavalta, jossa viimeisimmät komennot ovat yläosassa;

Tässä tulee komento git rebase. Aina kun haluamme muokata tiettyä sitoutumista git rebase -toiminnolla, meidän on ensin määritettävä haaramme uudelleen siirtämällä HEAD takaisin pisteeseen juuri ennen sitoutumista, jota haluamme muokata. Meidän tapauksessamme meidän on muutettava sitoutumista, joka lukee Page Navigation View.

Tässä huomaa sitoutumisen hajautus, joka on juuri ennen sitoutumista, jota haluamme muuttaa; kopioi hash ja suorita seuraavat vaiheet:

  • Alusta haara uudelleen siirtyäksesi sitoutumaan ennen kohdesitoumustamme; Suorita git rebase -i 8d74af102941aa0b51e1a35b8ad731284e4b5a20
    • Komentojen erittely: Tässä suoritamme Git-komennon rebase -komennon vuorovaikutteisessa tilassa mukana toimitetulla SHA1-hashilla sitoutumisena suorittamaan uudelleen.
  • Tämä suorittaa Gasin uudelleenkäynnistyskomennon interaktiivisessa tilassa ja avaa tekstieditorin, jossa näkyvät kaikki tekemäsi tehtävät, jotka tulit sen jälkeen, kun olet sitoutunut uudelleen . Se näyttää hieman tältä:

Huomaa, kuinka jokaisella sitoutuneella on sana pick sen edessä ja alla olevassa sisällössä on kaikki mahdolliset avainsanat, joita voimme käyttää. Koska haluamme muokata sitoutumista, meidän on vaihdettava pick 4155df1cdc7 Page Navigation View muotoon edit 4155df1cdc7 Page Navigation View. Tallenna muutokset ja poistu editorista.

Nyt haarasi perustetaan uudelleen ajankohtaan juuri ennen tekemääsi sitoutumista, joka sisälsi _navigation.html.haml. Avaa tiedosto ja tee haluamasi muutokset tarkastelupalautteen mukaisesti. Kun muutokset on tehty, aseta ne suorittamalla git add _navigation.html.haml.

Koska muutokset on järjestetty, on aika siirtää haara HEAD takaisin Alun perin omistamasi sitoutuminen (sisältäen myös lisäämämme uudet muutokset), suorita git rebase --continue, tämä avaa pääteeditorin päätelaitteessa ja näyttää sitoutumisviestin, jota muokkaimme uudelleenkäynnistyksen aikana; Page Navigation View. Voit muuttaa tätä viestiä, jos haluat, mutta jätämme sen sellaisenaan, joten tallenna ja sulje editori. Tässä vaiheessa Git toistaa kaikki tekemät muutokset seurasi juuri muokkaamasi sitoutumisen jälkeen ja haara HEAD on palannut alun perin omistamaamme sitoutumiseen, ja se sisältää myös uudet muutokset, jotka teit johonkin sitoutumisesta.

Koska muutimme jälleen sitoutumista, joka on jo etärepossa, tarvitsemme voimaa työntämään tätä haaraa uudelleen käyttämällä git push --force-with-lease <remote_name> <branch_name>.

Tilanne 3 : Minun on lisättävä, poistettava tai yhdistettävä sitoumuksia

Yleinen tilanne on, kun olet tehnyt useita sitoumuksia vain korjataaksesi jotain aiemmin sitoutunutta. Vähennetään nyt niitä niin paljon kuin pystymme, yhdistämällä ne alkuperäisiin sitoumuksiin.

Sinun tarvitsee vain aloittaa interaktiivinen uudelleenkäynnistys kuten muissakin tilanteissa.

Kuvittele nyt, että haluat yhdistää kaikki nämä korjaukset osiin c22a3fa0c5c Render navigation partial. Sinun tarvitsee vain:

  1. Siirrä korjaukset ylöspäin niin, että ne ovat suoraan sen sitoutumisen alapuolella, jonka haluat lopulta säilyttää.
  2. Muuta pick arvoksi squash tai fixup jokaiselle korjaukselle.

Huomaa: squash pitää sitoutuneet viestit kuvauksessa. fixup unohtaa korjausten sitoutumisviestit ja säilyttää alkuperäisen.

Saat jotain tällaista:

Tallenna muutokset, poistu editorista , ja olet valmis! Tämä on tuloksena oleva historia:

Kuten aikaisemmin, sinun tarvitsee vain tehdä nyt git push --force-with-lease <remote_name> <branch_name> ja muutokset ovat voimassa.

Jos haluat poistaa sitoutuksen haarasta kokonaan, squash tai fixup, kirjoita vain drop tai poista kyseinen rivi.

Vältä ristiriitoja

Vältä ristiriitoja varmista, että sitoudut ”aikajanalla siirtyminen ylöspäin” ei kosketa samoja tiedostoja, joita niiden jälkeiset komennot koskettavat.

Pro-tip : Nopeat korjaukset

Jos tiedät tarkalleen, minkä sitoutumisen haluat korjata, sinun ei tarvitse tuhlata aivosyklejä ajatellen hyviä väliaikaisia nimiä korjauksille 1, 2 korjauksille,…, ”Korjaa 42”.

Vaihe 1: Tapaa --fixup

Kun olet järjestänyt muutokset korjaamalla mikä tahansa korjattava, vain Git tee kaikki muutokset tällä tavalla:

(Huomaa, että tämä on hash sitoutumiselle c22a3fa0c5c Render navigation partial)

Tämä luo tämän sitoutumisviestin: fixup! Render navigation partial.

Vaihe 2: Ja sivupainike --autosquash

Helppo interaktiivinen uudelleenasennus. Voit git sijoittaa fixup s automaattisesti oikeaan paikkaan.

git rebase -i 4155df1cdc7 --autosquash

Historia näytetään näin:

Valmiina vain tarkista ja jatka.

Jos sinusta tuntuu seikkailunhaluiselta, voit tehdä ei-interaktiivisen uudelleenkäynnistyksen git rebase --autosquash, mutta vain, jos haluat elää vaarallisesti, kuten sinäkin ” minulla ei ole mahdollisuutta tarkistaa tehtyjä kurpitsoja ennen niiden uudelleenkäyttöä.

Tilanne 4: Minun Git-sitoutumishistoriani ei ole järkevää, tarvitsen uuden alun!

Jos me ”Työskentelemällä suuren ominaisuuden parissa, on yleistä, että tehdään useita korjaus- ja tarkistus-palautemuutoksia, jotka tehdään usein. Sen sijaan, että haaroitettaisiin jatkuvasti haaraa, voimme jättää sitoumusten puhdistamisen kehityksen loppuun asti.

Täällä korjaustiedostojen luominen on erittäin kätevää. Itse asiassa korjaustiedostot olivat ensisijainen tapa jakaa koodi sähköpostin välityksellä yhteistyössä suurissa avoimen lähdekoodin projekteissa, ennen kuin Git-pohjaiset palvelut, kuten GitLab, olivat kehittäjien käytettävissä. Kuvittele, että sinulla on yksi sellainen haara (esim. add-page-navigation), jossa on paljon sitoumuksia, jotka eivät välitä taustalla olevia muutoksia selvästi. Näin voit luoda korjaustiedoston kaikille tässä haarassa tekemäsi muutokset:

  • Ensimmäinen paikka korjaustiedoston luomisessa on varmistaa, että haarassasi on kaikki muutokset kohdasta master haara ja sillä ei ole ristiriitoja saman kanssa.
  • Voit suorittaa git rebase master tai git merge master, kun tarkistat uudelleen. ulos add-page-navigation -haarassa saadaksesi kaikki muutokset master -haaraan.
  • Luo nyt korjaustiedosto ; run git diff master add-page-navigation > ~/add_page_navigation.patch.
    • Komentojen erittely: Tässä käytämme Gitin diff-ominaisuutta ja pyydämme eroa master haara ja add-page-navigation haara ja ohjataan ulostulo (symbolin > kautta) tiedostoon nimeltä add_page_navigation.patch meissä er kotihakemisto (yleensä ~/ * nix -käyttöjärjestelmissä).
  • Voit määrittää minkä tahansa polun, jonka haluat säilyttää tämän tiedoston ja tiedostonimi ja laajennus voivat olla mitä haluat.
  • Kun komento on suoritettu ja et näe virheitä, korjaustiedosto luodaan.
  • maksa nyt master haara; ajaa git checkout master.
  • Poista haara add-page-navigation paikallisesta reposta; suorita git branch -D add-page-navigation. Muista, että tähän haaraan on jo tehty muutoksia luotussa korjaustiedostossa.
  • Luo nyt uusi haara samalla nimellä (kun master on kirjautuneena); ajaa git checkout -b add-page-navigation.
  • Tässä vaiheessa tämä on uusi haara eikä siinä ole mitään muutoksia.
  • Käytä lopuksi korjaustiedostostasi tekemäsi muutokset; git apply ~/add_page_navigation.patch.
  • Tässä kaikki tekemäsi muutokset otetaan käyttöön haarassa ja ne näyttävät sitoutumattomilta, ikään kuin kaikki muokkauksesi missä se on tehty, mutta yksikään muunnoksista ei ole tosiasiallisesti tehty haarassa.
  • Nyt voit mennä eteenpäin ja sitouttaa yksittäisiä tiedostoja tai tiedostoja ryhmiteltyinä vaikutusalueen mukaan haluamassasi järjestyksessä lyhyillä sitoutumisviesteillä.

Kuten aikaisemmissakin tilanteissa, me periaatteessa muokkaimme koko haaraa, joten on aika pakottaa! Edellä olevista vinkeistä voit oppia tarkempia aiheita käsittelevistä käsitteistä Gitin virallisessa dokumentaatiossa. Hyvää onnea!

Kuva pan xiaozhen Unsplashista

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *