Skip to content

Työväline tehtävät viikko 4: Git ja GtiHub

Irene Nikkarinen edited this page Sep 25, 2017 · 20 revisions

Versionhallinta: Git ja GitHub

Git on eräs versionhallinta-työkalu, jonka avulla voidaan säilöä ja julkaista koodia. Git ei ole pelkästään varmuuskopiovarasto, joka säilöö koodia projektin eri vaiheista. Tämä mahdollistaa myös projektin vanhaan versioon palaamisen, jos jokin menee pieleen uutta koodia lisättäessä. Git mahdollistaa myös toisten projektiin osallistumisen open source -periaatteiden mukaan, joissa korostetaan yhteistyötä ja avoimuutta. GitHub on palvelu, joka säilyttää Git-projekteja. Gittiä ja GitHubia käytetään yliopistolla yksilö- ja ryhmätöissä, sekä yleisesti työelämässä.

1. [GitHub]

Jos et luonut GitHub-käyttäjää ekalla viikolla, tai asentanut Gittiä koneellesi, tee se nyt. Git on valmiiksi laitoksen koneilla ja kaikissa Ubuntu-asennuksissa. GitHubin rakennetaan eräänlainen portfolio, jonka voi linkata myös CV:hen, kannattaa siis valita siisti käyttäjänimi.

2. [ssh-git]

Jos et ole tehnyt viikon 3 ssh-key-tehtävää, tee se ensin. Myös GitHubilla on ssh-avaimen luomiseksi ohjeet.

Lisää julkinen ssh-avaimesi GitHubiin, jos et ole sitä vielä tehnyt, jotta gitin käyttö helpottuu. Ohjeet GitHubissa.

3. [email]

Liitä nimesi ja sähköpostiosoitteesi Gitiin, jotta tekemäsi muutokset voidaan liittää sinuun. GitHub tarjoaa siihen ohjeet. Jos et halua sähköpostiasi julkiseksi, GitHub tarjoaa erityisen noreply-sähköpostiosoitteen.

Huomaa Note-kohta äsken linkatulla sivulla! Noreplyn muoto riippuu siitä, milloin olet luonut käyttäjätunnuksen, ja jos loit tunnuksesi vasta lapio-kurssilla, saat asetettua noreply-sähköpostiosoitteen kun asetat käyttäjätilisi asetuksista sähköpostiosoitteesi yksityiseksi.

4. [git-init]

Luodaan nyt oma Git-projekti ja opetellaan lisää Gitin käyttöä. Avaa komentorivi ja luo omalle koneellesi uusi kansio. Tämän jälkeen aja komento git init kansion sisällä, jolloin syntyy piilotettu alikansio .git. Olet luonut onnistuneesti git-kansion, jos ajaessasi komennon git status tulostuu On branch master.

Jos et ole tottunut vim-editorin käyttäjä, muuta gitin oletuseditoriksi nano: git config --global core.editor nano.

Windowsissa vaihda nanon paikalle notepad.

5. [git-repo]

Luo GitHubissa uusi projekti, eli kavereiden kesken repo. Jos et ole jo hankkinut GitHubin student-packia(mikä ehdottomasti kannattaa) tai et maksa GitHubin käytöstä, projektin on pakko olla julkinen. Älä luo tälle projektille valmiiksi READMEa tai lisenssiä. Niiden kuuluu olla kaikissa koodiprojekteissa, mutta tässä tapauksessa ne saattaisivat aiheuttaa konfliktin remotea lisättäessä.

Ohjeet uuden repon luomiseksi.

Liitä GitHubin repo projektisi, jolloin siitä tulee projektin remote. Ohjeet jälleen GitHubista.

6. [add-to-commit]

Tietoa lisätään Gittiin committeina. Commit on eräänlainen paketti muutoksia. Sitä voi myös ajatella uutena askeleena kohti valmista projektia. Esimerkiksi ohjelmaa koodattaessa uuden toiminnallisuuden lisääminen voitaisiin luontevasti paketoida yhteen committiin.

Luo uuteen kansioon tiedosto lapio_vko4.txt. Aja tämän jälkeen git status. Jos tiedoston nimi on punaisella (Untracked files tai myöhemmin Not staged for commit), muutoksia sen sisällä ei olla lisäämässä seuraavaan committiin. Lisää se seuraavaan committiin komennolla git add (muista käyttää tab-täydennystä).

Jos lisäät lapio-tiedoston Gittiin ja ajat git status, näkyy tiedosto nyt Changes to be commited-otsikon alla vihreällä.

Lisää seuraavaksi tekstiä tiedostoon lapio_vko4.txt vähintään kolme riviä (niitä tarvitaan tulevissa tehtävissä). Kun ajat git add -p, voit valita muutos kerrallaan, haluatko lisätä sen Gitin committiin (y=lisää, n=älä lisää). Komento ei kuitenkaan huomaa muutoksia tiedostoissa, joita ei ole vielä kertaakaan lisätty Gittiin (näkyvät git statuksessa Untracked files -otsikon alla). Tällaisia ovat myös uudet tiedostot, eli ne on aina lisättävä käsin, minkä jälkeen muutoksia niiden sisällä seurataan. Lisää muutokset.

git status on erittäin hyödyllinen komento, jonka avulla kannattaa jatkuvasti tarkistaa, missä tiedostoissa sijaitsevat muutokset olet lisäämässä committiin (näkyvät vihreällä). Älä lisää mitään salaista tietoa Gittiin. Vaikka poistaisit tiedon seuraavassa commitissa, se jää Gitin historiaan ja näkyy GitHubissa.

Jos olet lisännyt gitin committiin jotain vahingossa, miten saat sen pois? Vinkki: git status auttaa.

7. [git-commit]

Edellisessä tehtävässä valittiin, mitä lisätään committiin. Seuraavaksi paketoidaan itse commit kasaan. Jokaisella commitilla on otsikko, joka kuvaa siinä tehtyjä muutoksia. Aja git commit -m "[kuvaava viesti]", jossa kerrot selkeästi alle 50 merkissä, mitä teit edellisen commitin jälkeen. Jos komennosta jättää vivun -m pois, tekstieditori aukeaa, ja voit kirjoittaa pidemmän viestin otsikon alle.

8. [git-push]

Kun commit on luotu, voidaan se julkaista puskemalla se GitHubiin. Aja git push -u origin master julkaistaksesi muutokset. Komennossa määrität, että haluat julkaista ja hakea tietoa originin (jonka määritit tehtävässä [git repo]) master-branchiin. Kun nämä on kerran määritetty, pelkkä git push riittää. Käy tarkistamassa GitHubista, että lapio_vko4.txt näkyy.

9. [git-pull]

Samasta projektista on nyt olemassa kaksi versiota: se, joka on koneellasi (local), ja se, joka on GitHubissa (remote). Katsotaan seuraavaksi, mitä käy, kun nämä kaksi tilaa eivät ole aina täysin samat.

Aloitetaan tekemällä muutoksia projektiin GitHubin kautta. Pääset muokkaamaan tiedostoja painamalla niiden nimeä, ja oikealla olevaa kynä-ikonia. Lisää lapio_vko4.txt uusi rivi tekstiä, kerro vaikka mikä oli lempiviikkosi, ja luo commit sivun alalaidasta vihreästä napista (voit myös kirjoittaa fiksumman commit-viestin, kuin "update"). Näkyvätkö muutokset myös omalla koneellasi? Entä mitä tulostuu, jos ajat

git fetch
git status

git fetch hakee projektin uusimman tilan GitHubista, mutta ei tee muutoksia lokaaliin työhön. Jos git status ei jatkossa näytä ajankohtaista tietoa, aja ensin git fetch.

Muutokset eivät näy omalla koneellasi, mutta git osaa kertoa, että GitHubissa on muutoksia jota omalla koneellasi ei ole (Your branch is behind 'origin/master').

Hae muutokset GitHubista omalle koneellesi komennolla git pull.

10. [stash]

Kokeillaan seuraavaksi mitä käy, jos GitHubissa on jotain tietoa, mitä omalla koneellasi ei ole, ja omalla koneellasi jotain, mitä GitHubissa ei.

Lisää tekstiä GitHubin kautta lapio_vko4.txt. Muuta samaa tiedostoa myös omalla koneellasi, kerro tällä kertaa, mikä oli lempitehtäväsi. Älä kuitenkaan tee committia tai muuta samoja rivejä.

Kokeile pullata. Se ei toimi, koska koneellasi on muutoksia samaan tiedostoon, kuin GitHubissa, eikä muutoksia ole commitoitu. Tällaisessa tilanteessa voit laittaa lokaalit muutokset syrjään stashiin. Aja siis git stash. Avaa lapio_vko4.txt, mutta älä muuta mitään. Näkyykö lempitehtäväsi? Aja myös git status, ollaanko mitään tiedostoja laittamassa committiin? Kaikki commitoimattomat muutokset ovat nyt piilossa stashissa, ja voit pullata. Saat muutokset takaisin käskyllä git stash pop. Käy vielä tarkistamassa, että lempitehtäväsi lukee jälleen lapio_vko4.txt.

HUOM! Tiedostojen, joita git ei vielä seuraa (untracked) piilottamiseksi stash on ajettava vivun -u kanssa.

11. [merge]

Jatketaan vielä kahden rinnakkaisen tilan kanssa leikkimisellä.

Tee lokaaleista muutoksistasi commit.

Luo GitHubissa uusi tiedosto uusi_tiedosto.txt napista Create new file, ja kirjoita sinne mitä vaan. Muokkaa omalla koneellasi tiedostoa lapio_vko4 ja tee muutoksista commit.

Kokeile pushata committisi. Push ei onnistu (failed to push), hint kertoo miksi. Et siis voi pushata committiasi, koska GitHubissa on jotain muutoksia, mitä sinulla ei ole omalla koneellasi. Pullaa uudet muutokset koneellesi.

Käskyn ajo ei kuitenkaan toimi samoin kuin aikaisemmin, vaan avautuu tekstieditori, jossa on teksti Merge branch 'master' of ....

Git on katsonut sekä GitHubissa olevaa committia, että oman koneen committia, ja todennut, että molemmat voivat jatkaa eloansa rinnakkain, eli niiden muutokset eivät sulje toisiaan pois. Git teki siis automaattisen merge-commitin. Nyt Git haluaa, että annat commitille viestin, ja tarjoaa sille ehdotusta. Viimeistele commit tallentamalla commit-viesti.

Nyt komennon git status mukaan olet tehnyt 2 committia (ahead by 2 commits). Toinen niistä oli se, jossa kerrot lempitehtäväsi, ja toinen on merge-commit. Jos ylimääräisen commitin luominen tuntuu rumalta, pullin voi ajaa option --rebase kanssa, jolloin lokaali commit asetetaan uudemmaksi commitiksi, ja uuden commitin luomiselta vältytään.

12. [merge-conflict]

Tehtäessä yhteistyötä aina välillä käy niin, että kaksi koodaria muokkaavat samoja rivejä. Miten Git tietää silloin, kumpi muutos halutaan pitää? No, ei se tiedäkään, eli joskus automaattinen merge ei onnistu. Silloin jonkun täytyy käsin valita pidettävät muutokset, eli ratkottava merge-konfliktit.

Tee GitHubissa muutoksia tiedostoon lapio_vko4.txt riville 3. Kirjoita selkeyden vuoksi vaikka terveisiä GitHubista. Muokkaa täsmälleen samaa riviä omalla koneellasi (esim. terveisiä mun koneelta) ja tee commit.

Mitä git status tulostaa nyt? Koeta nyt hakea GitHubin uudet muutokset koneellesi.

Merge-conflicteja voi tulla myös, kun otat muutoksia pois stashista.

Tulostuu:

Auto-merging ...
CONFLICT (content): Merge conflict in lapio_vko4.txt
Automatic merge failed; fix conflicts and then commit the result.

CONFLICT kertoo missä tiedostossa päällekkäiset muutokset ovat tapahtuneet. Avaa tämä tiedosto. Siellä näet jotain outoa:

<<<<<<< HEAD
terveisiä mun koneelta
=======
terveisiä GitHubista
>>>>>>> baaf2c96cw031e11138d42c1a35065b9bf8b4400b

Toisensa poissulkevat commitit on siis eroteltu <, > ja = -merkkien avulla. HEAD tarkoittaa tämänhetkistä committia, ja tuo epämääräinen kirjain-numero-yhdistelmä on remotesta saadun commitin yksilöivä merkkijono, eli hash. Hienostuneemmat editorit, kuten VSCode mahdollistavat conflictien resolvaamisen yhdellä klikkauksella, mutta muuten ainoa vaihtoehto on poistaa sen ne rivit, joita ei haluta pitää jatkossa. Valitse mitä haluat pitää, tai kirjoita lisää tekstiä, mutta poista joka tapauksessa kaikki merkeillä <, = tai > alkavat rivit.

Aja sen jälkeen git status. Git muistuttaa, että olet ratkaisemassa konflikteja. Lisää ratkaisusi gittiin, tarkita git status ja tee uusi commit (Git ehdottaa taas merge-commit-viestiä). Mitä nyt tulostuu komennolla git status?. Pushaa muutoksesi GitHubiin.

13. [issue-fork-pull-request]

Käyttäjät huomaavat projektien ongelmat parhaiten. Tällöin projektille voi tehdä GitHubissa issuen, ja kertoa ohjelman vajaavaisuuksista. Jos kuitenkin tietää ongelman ratkaisun, voi sitä ehdottaa projektin omistajalle.

Ensimmäisellä viikolla kloonattiin repo, eli kopioitiin valmiiksi olemassaoleva projekti omalle koneelle. Jotta tätä kautta voitaisiin julkaista (pushata) alkuperäiseen projektiin, sen omistajan tulee lisätä kloonaaja projektin kehittäjäksi.

On kuitenkin myös toinen tapa ehdottaa muutoksia olemassaolevaan projektiin: fork. Kun forkkaat projektin lisäät kopion siitä käyttäjäsi repositorioksi. Tällöin voit kloonata oman forkkisi, ja puskea siihen riippumatta alkuperäisestä omistajasta.

Jos oman kopioosi, eli forkkiisi tekemäsi muutokset ovat mielestäsi niin hyviä, että haluat ehdottaa niitä myös alkuperäiseen projektiin, se tehdään pull requestin avulla. Tällöin alkuperäisen projektin omistaja voi halutessaan liittää, eli mergetä muutoksesi.

Etsi vapaavalintainen open-source-projekti (esim. Googlen Guava tai VarjoCafe) ja tutki repon sisältöä. Etsi projektin README ja lisenssi, ja katso mitä ne pitävät sisällään. Tarkista projektin issuet, commitit ja pull-requestit ja tutki niiden sisältöä, ja niistä käytyä keskustelua. Etsi myös projektiin osallistuneet ja heihin liittyvä statistiikka.

Tämä oli vain pintapuolinen raapaisu Gitin käyttöön. Jos olet jo tottunut käyttäjä, kannattaa syventyä tarkemmin Gitin eri mahdollisuuksiin. Kuitenkin vasta-alkajana yhteistyöprojekteissa versionhallinnan avulla hukkaa ja rikkoo helposti koodia - jos törmäät outoon virheeseen, kysy rohkeasti apua, äläkä ajele sokkona komentoja. Gittiä oppii parhaiten käyttämällä sitä, älä siis lannistu ja poista projektia heti epäonnistuessasi.

14. [kurssipalaute]

Anna anonyymiä kurssipalautetta! Saat pisteen!

Tehtävät loppuvat tähän.

Kurssilla ei ole koetta, vaan pakollinen itsearviointi. Tee se täällä, jotta saat kurssiarvosanan. Itseisarviointi on tehtävä 1.10 mennessä.

Tarkistuspiste

Viime viikolla oli pari vaarallista tehtävää. Nyt teillä pyörii ajelehtivia croneja ympäri pajaa & salaamattomia yksityisiä ssh-avaimia kotihakemistossa. Tai .htaccess-tiedosto on livahtanut väärään paikkaan, eikä kotihakemistoon pääse. Korjataan ongelmat.

  1. Tarkista että ssh-avaimessasi on salasana
  2. Tarkista että et ole jättänyt cronia lojumaan
  3. Tarkista vielä onko wget-images -skriptin jäljiltä jäänyt ylimääräisiä giganttisia hakemistoja. Jos on, niin poista ne.
  4. Tarkista, että kotihakemistollasi on järkevät oikeudet viime viikon tehtävän [chmod-redux] mukaisesti.

Tarkista pisteesi https://lapiostats.herokuapp.com ja kerro pajassa lapio-ohjaajalle jos niissä on jotain pielessä. Voit laittaa asiasta myös sähköpostia.

Hyvää syksyn jatkoa ja voimia muihin opintoihin! Muista kiittää paja-ohjaajia jos heistä oli apua.