Kuinka ei enää pelätä Gitiä

Koneiden ymmärtäminen epävarmuuden poistamiseksi

Oletko ollut täällä aikaisemmin? (web-sarjakuva XKCD: ltä)

Mikä on Git joka tapauksessa?

"Se on versionhallintajärjestelmä."

Miksi tarvitsen sitä?

"Versiohallintaan, typerä."

Okei, okei, en ole vielä liian avulias. Perusidea on seuraava: Kun projektit kasvavat liian suuriksi ja osallistujien lukumäärä on liian suuri, on mahdotonta seurata, kuka teki mitä ja milloin. Onko joku ottanut käyttöön muutoksen, joka rikkoi koko järjestelmän? Kuinka selvittää, mikä tuo muutos oli? Kuinka palaat takaisin siihen, miten asiat olivat ennen? Takaisin katkeamattomaan ihmemaahan?

Otan sen askeleen pidemmälle - sano, että ei ole projekti, jolla on paljon avustajia, vain pieni projekti kanssasi luojana, ylläpitäjänä ja jakelijana: Luodaan projektille uusi ominaisuus, joka esittelee hienoja virheitä, jotka saat selville myöhemmin. Et muista, mitä muutoksia olet tehnyt olemassa olevaan koodikantaan tämän uuden ominaisuuden luomiseksi. Ongelma?

Vastaus kaikkiin näihin ongelmiin on versiointi! Jos sinulla on versioita kaikesta koodaamastasi, varmistat, että tiedät kuka muutokset, mitkä muutokset ja missä tarkalleen missä projektin alusta lähtien!

Ja nyt kehotan teitä lopettamaan ajatuksen (g) mustasta laatikosta, avaamaan se ja selvittämään, mitä aarteita odottaa. Selvitä, kuinka Git toimii, ja et koskaan enää saa ongelmia saada asiat toimimaan. Kun olet käynyt läpi tämän, lupaan, että ymmärrät hulluuden tehdä sen, mitä yllä oleva XKCD-sarjakuva sanoo. Juuri sitä versiointi yrittää estää.

Kuinka Git?

Oletan, että tiedät Gitin peruskomennot tai olet kuullut niistä ja käyttänyt niitä ainakin kerran. Jos ei, tässä on perussana, jonka avulla pääset alkuun.

Varasto: paikka asioiden varastointiin. Gitin kanssa tämä tarkoittaa koodikansiota

head: “osoitin” viimeisimmälle koodille, jonka kanssa olet työskennellyt

lisää: Toiminto, jolla pyydetään Gitiä seuraamaan tiedostoa

sitoutua: Toimenpide nykyisen tilan tallentamiseksi - sellainen, että tätä tilaa voidaan tarkistaa tarvittaessa

kaukosäädin: arkisto, joka ei ole paikallinen. Voi olla toisessa kansiossa tai pilvessä (esimerkiksi: Github): auttaa muita ihmisiä tekemään yhteistyötä helposti, koska heidän ei tarvitse hankkia kopiota järjestelmästäsi - he voivat vain saada sen pilvestä. Lisäksi varmistaa, että sinulla on varmuuskopio, jos rikkoat kannettavan tietokoneesi

pull: Toiminto päivitetyn koodin hakemiseksi kaukosäätimestä

push: Toiminto päivitetyn koodin lähettämiseksi kaukosäätimeen

yhdistäminen: Toiminto kahden eri version version yhdistämiseksi

status: Näyttää tiedot nykyisestä arkiston tilasta

Mihin Git?

Esittelyssä taikuutta, jota hallitsee piilotettu kansio: .git /

Jokaisessa git-arkistossa näet jotain tällaista

$ puu .git /
.git /
PÄÄ
├── asetukset
├── kuvaus
├── koukut
│ ├── applypatch-msg.sample
│ ├── Sitout-msg.näyte
│ ├── päivityksen jälkeinen näyte
│ ├── esihakemuslähetys.esimerkki
│ ├── ennalta sitoutuminen.näyte
│ ├── ennakko-näyte
│ ├── pre-rebase.sample
│ ├── ennakko-vastaanotto.näyte
│ ├── valmistele-sito-msg.näyte
│ └── päivitys.esimerkki
├── tiedot
│ └── sulje pois
├── esineitä
│ ├── tiedot
│ └── pakkaus
└── viittaa
    ├── päät
    └── tunnisteet
8 hakemistoa, 14 tiedostoa

Näin Git hallitsee ja hallitsee koko projektiasi. Mennään kaikki tärkeät bitit yksi kerrallaan.

Git koostuu 3 osasta: esinevarasto, hakemisto ja työhakemisto.

Esinevarasto

Näin Git tallentaa kaiken sisäisesti. Jokaiselle lisättämäsi projektin tiedostolle Git luo tiedostoon tiivisteen ja tallentaa tiedoston kyseisen tiivisteen alle. Esimerkiksi, jos luon nyt helloworld-tiedoston ja teen git add helloworld (mikä käskee Git: tä lisäämään helloworld-nimisen tiedoston git-objektivarastoon), saan jotain tällaista:

$ puu .git /
.git /
PÄÄ
├── asetukset
├── kuvaus
├── koukut
│ ├── applypatch-msg.sample
│ ├── Sitout-msg.näyte
│ ├── päivityksen jälkeinen näyte
│ ├── esihakemuslähetys.esimerkki
│ ├── ennalta sitoutuminen.näyte
│ ├── ennakko-näyte
│ ├── pre-rebase.sample
│ ├── ennakko-vastaanotto.näyte
│ ├── valmistele-sito-msg.näyte
│ └── päivitys.esimerkki
├── hakemisto
├── tiedot
│ └── sulje pois
├── esineitä
│ ├── a0
│ │ └── 423896973644771497bdc03eb99d5281615b51
│ ├── tiedot
│ └── pakkaus
└── viittaa
    ├── päät
    └── tunnisteet
9 hakemistoa, 16 tiedostoa

Uusi objekti on luotu! Niille, jotka ovat kiinnostuneita menemästä konepellin alle, Git käyttää sisäisesti hash-object-komentoa kuten:

$ git hash-object helloworld
a0423896973644771497bdc03eb99d5281615b51

Kyllä, se on sama tiiviste, jonka näemme esineiden kansion alla. Miksi alihakemisto, jossa on kaksi hash-merkkiä? Se nopeuttaa hakua.

Sitten Git luo objektin nimellä, jolla on yllä oleva hash, pakkaa annetun tiedostomme ja tallentaa sen sinne. Siksi voit myös itse nähdä objektin sisällön!

$ git kissatiedosto a0423896973644771497bdc03eb99d5281615b51 -p
Hei maailma!

Tämä kaikki on konepellin alla. Et ole koskaan käyttänyt kissatiedostoa päivittäisissä lisäyksissä. Lisäät vain, ja annat Gitin hoitaa loput.

Se on ensimmäinen Git-komento, tehty ja pölytty.

git add luo tiivisteen, pakkaa tiedoston ja lisää pakatun objektin esinevarastoon.

Toimiva hakemisto

Kuten nimestä voi päätellä, tässä työskentelet. Kaikki luomat ja muokattavat tiedostot ovat työhakemistossa. Loin uuden tiedoston, byeworld ja suoritin git-tilan:

$ git -tila
Oksassa päällikkö
Ei vielä sitoutumista
Sitoumukset:
  (käytä "git rm - välimuistissa  ..." avaamiseksi)
uusi tiedosto: helloworld
Lukitsemattomat tiedostot:
  (käytä "git add  ..." lisätäksesi sitoumukset)
byeworld

Jäljittämättömät tiedostot ovat tiedostoja työhakemistossa, joita emme ole pyytäneet hallitsemaan.

Jos työhakemistossa ei olisi ollut mitään tekemistä, saisimme seuraavan viestin:

$ git -tila
Oksassa päällikkö
mitään sitoutumista, työskentelevä puu puhdas

jonka olen varma, että ymmärrät nyt. Ohita haara ja sitoutu nyt. Tärkeintä on, että työskentelevä puu (hakemisto) on puhdas.

Hakemisto

Tämä on Gitin ydin. Tunnetaan myös nimellä pysähdysalue. Hakemisto tallentaa tiedostojen kartoituksen objektikappaleessa. Tässä on sitoumusten tekeminen. Paras tapa nähdä tämä on testata se!

Tehdään lisäys tiedostoon helloworld

$ git activ -m "Lisää helloworld"
[master (root-commit) a39b9fd] Lisää helloworld
 1 tiedosto muutettu, 1 lisäys (+)
 luo tila 100644 helloworld

Takaisin puumme:

$ puu .git /
.git /
├── COMMIT_EDITMSG
PÄÄ
├── asetukset
├── kuvaus
├── koukut
│ ├── applypatch-msg.sample
│ ├── Sitout-msg.näyte
│ ├── päivityksen jälkeinen näyte
│ ├── esihakemuslähetys.esimerkki
│ ├── ennalta sitoutuminen.näyte
│ ├── ennakko-näyte
│ ├── pre-rebase.sample
│ ├── ennakko-vastaanotto.näyte
│ ├── valmistele-sito-msg.näyte
│ └── päivitys.esimerkki
├── hakemisto
├── tiedot
│ └── sulje pois
├── lokit
│ ├── PÄÄ
│ └── viittaa
│ └── päät
│ └── päällikkö
├── esineitä
│ ├── a0
│ │ └── 423896973644771497bdc03eb99d5281615b51
│ ├── a3
│ │ └── 9b9fdd624c35eee08a36077f411e009da68c2f
│ ├── fb
│ │ └── 26ca0289762a454db2ef783c322fedfc566d38
│ ├── tiedot
│ └── pakkaus
└── viittaa
    ├── päät
    │ └── päällikkö
    └── tunnisteet
14 hakemistoa, 22 tiedostoa

Ah, mielenkiintoista! Objektikaupassamme on 2 uutta objektia, ja joitain juttuja, joita emme vielä ymmärrä, lokit ja viitteet Palataan ystävämme kissatiedostoon:

$ git kissatiedosto a39b9fdd624c35eee08a36077f411e009da68c2f -p
puu fb26ca0289762a454db2ef783c322fedfc566d38
tekijä = <=> 1537700068 +0100
toimeksiantaja = <=> 1537700068 +0100
Lisää helloworld
$ git kissatiedosto fb26ca0289762a454db2ef783c322fedfc566d38 -p
100644 möykky a0423896973644771497bdc03eb99d5281615b51 helloworld

Kuten voit arvata, ensimmäinen objekti on sitomuksen metatiedot: kuka teki mitä ja miksi, puulla. Toinen kohde on todellinen puu. Jos ymmärrät unix-tiedostojärjestelmän, tiedät tarkalleen, mikä tämä on.

Gitissä oleva puu vastaa Git-tiedostojärjestelmää. Kaikki on joko puuta (hakemisto) tai möykky (tiedosto) ja jokaisen sitoutumisen yhteydessä Git myös tallentaa puutiedot kertomaan itselleen: näin toimivan hakemiston pitäisi näyttää tässä vaiheessa. Huomaa, että puu osoittaa kunkin sisältämän tiedoston tiettyyn kohteeseen (hash).

On aika puhua oksista! Ensimmäinen sitoutumisemme lisäsi joitain muita juttuja .git / samoin. Kiinnostuksemme on nyt .git / refs / heads / master:

$ cat .git / refs / heads / master
a39b9fdd624c35eee08a36077f411e009da68c2f

Tässä on mitä sinun on tiedettävä sivuliikkeistä:

Gitissä oleva sivukonttori on kevyt, siirrettävä osoitin jommallakummalle näistä toimeksiannoista. Oletushaaran nimi Gitissä on isäntä.

No, mitä? Tykkään ajatella oksat haarukana koodissasi. Haluat tehdä joitain muutoksia, mutta et halua rikkoa asioita. Päätät olla voimakkaampi raja kuin sitoutumisloki, ja sieltä sivut tulevat. Päällikkö on oletushaara, jota käytetään myös tosiasiallisena tuotantohaarana. Siksi yllä olevan tiedoston luominen. Kuten tiedoston sisällöstä voidaan arvata, se viittaa ensimmäiseen sitoutumiseemme. Siksi se on osoitin sitoutumiselle.

Tutkitaan tätä tarkemmin. Sano, että luon uuden sivukonttorin:

$ git haara loppuu
$ git haara
* päällikkö
  loppu

Siellä meillä on se, uusi haara! Kuten voitte arvata, uusi merkintä on lisätty tiedostoon .git / refs / heads / ja koska ylimääräistä sitoutumista ei ole, sen pitäisi osoittaa myös ensimmäiselle sitoutumisellemme, aivan kuten isäntälle.

$ cat .git / refs / heads / the-päättyy
a39b9fdd624c35eee08a36077f411e009da68c2f

Joo, tarkalleen! Muistatko byeworld? Tiedostoa ei vielä jäljitetty, joten riippumatta siitä, mihin haaraan siirryt, tiedosto olisi aina siellä. Sano, haluan siirtyä tähän haaraan nyt, joten kassan haara, kuten savuesitys.

$ git kassalla loppua
Vaihdettiin haaraan "päättyvä"
$ git haara
  hallita
* loppu

Nyt Git vaihtaisi konepellin alla kaikkia työhakemiston sisältöjä vastaamaan sivukomitean osoittamaa sisältöä. Toistaiseksi, koska tämä on täsmälleen sama kuin isäntä, se näyttää samalta.

Lisään ja sitoutan byeworld-tiedoston.

Mitä odotat muuttuvan objektit-kansiossa?

Mitä odotat muuttuvan refs / heads-kansiossa?

Ajattele tätä ennen siirtymistä eteenpäin.

$ puu .git /
.git /
├── COMMIT_EDITMSG
PÄÄ
├── asetukset
├── kuvaus
├── koukut
│ ├── applypatch-msg.sample
│ ├── Sitout-msg.näyte
│ ├── päivityksen jälkeinen näyte
│ ├── esihakemuslähetys.esimerkki
│ ├── ennalta sitoutuminen.näyte
│ ├── ennakko-näyte
│ ├── pre-rebase.sample
│ ├── ennakko-vastaanotto.näyte
│ ├── valmistele-sito-msg.näyte
│ └── päivitys.esimerkki
├── hakemisto
├── tiedot
│ └── sulje pois
├── lokit
│ ├── PÄÄ
│ └── viittaa
│ └── päät
│ ├── päällikkö
│ └── päättyy
├── esineitä
│ ├── 0b
│ │ └── 17be9dbc34c5a5fbb0b94d57680968efd035ca
│ ├── a0
│ │ └── 423896973644771497bdc03eb99d5281615b51
│ ├── a3
│ │ └── 9b9fdd624c35eee08a36077f411e009da68c2f
│ ├── b3
│ │ └── 00387d818adbbd6e7cc14945fdf4c895de6376
│ ├── d1
│ │ └── 8affe001488123b496ceb34d8b13b120ab4cb6
│ ├── fb
│ │ └── 26ca0289762a454db2ef783c322fedfc566d38
│ ├── tiedot
│ └── pakkaus
└── viittaa
    ├── päät
    │ ├── päällikkö
    │ └── päättyy
    └── tunnisteet
17 hakemistoa, 27 tiedostoa

3 uutta objektia - 1 lisäykseen, 2 sitoutumiseen! Käydä järkeen? Mitä luulet esineistä sisältävän?

  • Lähetä metatiedot
  • lisää objektin sisältö
  • Puun kuvaus

Kuvan viimeinen osa on: miten tämä sitoumuksen metatiedot toimii aikaisempien sitovien metatietojen kanssa. No, kissatiedosto!

$ git kissatiedosto 0b17be9dbc34c5a5fbb0b94d57680968efd035ca -p
100644 möykky d18affe001488123b496ceb34d8b13b120ab4cb6 byeworld
100644 möykky a0423896973644771497bdc03eb99d5281615b51 helloworld
$ git kissatiedosto b300387d818adbbd6e7cc14945fdf4c895de6376 -p
puu 0b17be9dbc34c5a5fbb0b94d57680968efd035ca
vanhempi a39b9fdd624c35eee08a36077f411e009da68c2f
tekijä = <=> 1537770989 +0100
toimeksiantaja = <=> 1537770989 +0100
lisää byeworld
$ git kissatiedosto d18affe001488123b496ceb34d8b13b120ab4cb6 -p
Hei maailmaa!
$ cat .git / refs / heads / the-päättyy
b300387d818adbbd6e7cc14945fdf4c895de6376

Näetkö sen lihavoituna? Vanhempi osoitin! Ja se on tarkalleen kuinka ajattelit sitä - linkitetty luettelo, joka yhdistää toimeksiannot toisiinsa!

Ja näetkö haaran toteutuksen? Se osoittaa sitoutumista, viimeisimmän, jonka teimme tarkistuksen jälkeen! Tietysti mestarin pitäisi silti osoittaa kypärämaailmaan sitoutumaan, eikö niin?

$ cat .git / refs / heads / master
a39b9fdd624c35eee08a36077f411e009da68c2f

Okei, olemme käyneet läpi paljon, tehdään yhteenveto tähän asti.

TL; DR

Git toimii objektien kanssa - pakatut versiot tiedostoista, joita pyydät Gitiltä seuraamaan.

Jokaisella esineellä on tunnus (Gitin luoma hash tiedoston sisällön perusteella).

Aina kun lisäät tiedoston, Git lisää uuden objektin esinevarastoon. Tästä syystä et voi käsitellä erittäin suuria tiedostoja Gitissä - se tallentaa koko tiedoston joka kerta, kun lisäät muutoksia, ei diff (vastapäätä yleisesti uskovia).

Jokainen sitoutuminen luo 2 objektia:

  1. Puu: Puun tunnus, joka toimii täsmälleen kuten unix-hakemisto: se osoittaa muihin puihin (hakemistoihin) tai bloboihin (tiedostoihin): Tämä rakentaa koko hakemistorakenteen tuolloin olemassa olevien objektien perusteella. Käskyjä edustavat lisäyksen luomat nykyiset objektit.
  2. Sitoumuksen metatiedot: Sitoumuksen tehneen sitoumuksen tunnus, puu, joka edustaa sitoumusta, sitoumussanomaa ja vanhemman sitoumusta. Muodostaa linkitetyn luettelorakenteen, joka yhdistää komitot.

Haarahakemistot osoittavat metatietoobjekteja, jotka kaikki on tallennettu .git / refs / heads-hakemistoon

Kaikki tämä on kulissien takana tapahtuvan ymmärryksen kannalta! Seuraavassa osassa käydään läpi joitain Git-toimintoja, jotka antavat ihmisille painajaisia:

nollata, yhdistää, vetää, työntää, noutaa ja miten ne muuttavat .git / -sovelluksen sisäistä rakennetta.

Muut tämän sarjan tarinat:

  • Kuinka ei enää pelätä Vimaa
  • Kuinka ei enää pelätä Pythonia

Nautitko tästä? Älä missaa viestiä uudelleen - tilaa postituslistani!