Git-versiohallinta¶
Ohjeet Ohjelmointi 1 -opintojaksolle
Tässä dokumentissa kerrotaan miten harjoitustyön suunnitelmaa, lähdekoodia sekä muita tiedostoja (mm. kuvat) käsitellään Git-versiohallinnan avulla Ohjelmointi 1 -opintojaksolla.
Tämä ohje koskee vain niitä opiskelijoita, jotka palauttavat harjoitustyönsä Git-etävarastoon. Jos haluat palauttaa harjoitustyön ZIP-pakettina, voit ohittaa tämän ohjeen. Palauttaminen Git-muodossa on erittäin suositeltavaa niille, jotka jatkavat seuraaville ohjelmointikursseille.
Ohje on pitkän puoleinen, mutta on tärkeää, että luet sen huolellisesti. Git-versiohallinnan käyttö on olennainen osa ohjelmistokehitystä, ja sen perusteiden ymmärtäminen on tärkeää paitsi tällä opintojaksolla, myös myöhemmissä tietojenkäsittelyn opinnoissa ja ohjelmistoalan työssä.
Ennen kuin aloitat¶
Asenna kehitystyökalut ja Git-versiohallinta, ellet ole vielä tehnyt niin.
Jos olet Jyväskylän yliopiston opiskelija, sinun tulee tietää
JY-käyttäjätunnuksesi jotta voit käyttää gitlab.jyu.fi-palvelua. Varmista,
että tiedät käyttäjätunnuksesi, ja kirjoita se muistiin ennen kuin aloitat
tämän ohjeen seuraamisen. Tässä ohjeessa viitataan toistuvasti
käyttäjätunnukseen tunnisteella kayttajatunnus. Korvaa tämä aina omalla
käyttäjätunnuksellasi.
Mikä Git on¶
Git on ohjelmisto, jolla voidaan toteuttaa tiedostojen versiohallintaa. Ohjelmistotyössä on erityisen tärkeää, että jokainen ohjelmistoon tehty muutos versioidaan selkeästi. Versiohallinnan käyttäminen yhteistyöskentelyyn ja muutosten jäljittämiseen on normi niin teollisessa ohjelmistotuotannossa, vapaan/avoimen lähdekoodin projekteissa kuin myös monien harrastajien henkilökohtaisissa töissä.
Versiohallinta mahdollistaa myös saman koodin parissa työskentelyn eri tietokoneilta, mikä sopii hyvin tälle kurssille, koska usein tehdään töitä eri tietokoneilta (mikroluokka, kotikone jne.).
Git-varasto (engl. repository) sisältää sekä kooditiedostot että koko projektin muokkaushistorian. GitLab ja GitHub ovat eräitä suosittuja internetissä toimivia palveluita, joissa Git-varastoja voidaan säilyttää.
Tällä kurssilla emme käytä Dropboxia, muistitikkuja, sähköpostia tai vastaavia palveluita kooditiedostojen jakamiseen, koska ne eivät sovellu todelliseen yhteistyöskentelyyn. Vaikka työskentelisitkin yksin, käytä versiohallintaa ohjaajien työn helpottamiseksi sekä harjoitustyön esittelyn mahdollistamiseksi.
Voit hyödyntää versiohallintaa opinnoissa muutenkin, esimerkiksi tutkielmien kirjoittamisessa.
Miten saan Gitin auki¶
Git on komentoriviohjelma, eli sitä ei varsinaisesti avata vaan käytetään komentoriviltä. Gitille on tarjolla myös graafisia käyttöliittymiä (ks. Luku 11. Tapoja käyttää Gitiä), jotka käytännössä suorittavat tarvittavia komentorivikomentoja puolestasi. Ohjelmointi 1 -kurssilla harjoittelemme käyttämään Gitiä komentoriviltä nk. bash-komentokehotteesta.
Valitse alta käyttöjärjestelmäsi mukainen käyttötapa.
- Asenna Git-työkalu mikäli et ole vielä tehnyt niin.
- Paina Käynnistä-painikkeen vieressä olevaa Haku-ikonia
- Kirjoita hakupalkkiin git bash
- Valitse löytyvistä tuloksista Git Bash

Tuloksena pitäisi avautua seuraava bash-komentorivipääte:

Voit testata, että Git-työkalu löytyy suorittamalla komento
Jos komento palauttaa versionumeron, niin git on asennettu oikein.
Varoitus
Git Bash -tulkissa liittäminen ei toimi tavallisella Ctrl + V tai Cmd + V-näppäinyhdistelmällä! Sen sijaan käytössä on seuraavat pikanäppäimet: - Liitä kopioitu teksti bashiin: Shift + Insert - Kopioi valittu teksti bashista: Ctrl + Insert (Cmd + Insert macOS:ssa)
Vaihtoehtoisesti voit oikeaklikata päätteen kursorista ja valita Paste tai Copy.
- Asenna Git-työkalu mikäli et ole vielä tehnyt niin
- Avaa Launchpad
- Kirjoita ylhäällä olevaan hakupalkkiin Pääte (tai Terminal jos käyttöjärjestelmän kieli on englanti)
- Avaa hakutuloksena löytyvä Pääte tai Terminal-sovellus

Tuloksena pitäisi avautua seuraava pääteikkuna:

Voit testata, että Git-työkalu löytyy suorittamalla komento
Jos komento palauttaa versionumeron, niin git on asennettu oikein.
- Asenna Git-työkalu mikäli et ole vielä tehnyt niin
- Käytä jakelun omaa päätettä. Pääte yleensä löytyy sanalla Terminal tai Terminal Emulator. Tämä usein avaa bash-päätteen, joka on sopiva tämän ohjeen kannalta.
Voit testata, että git-työkalu löytyy suorittamalla komento
Jos komento palauttaa versionumeron, niin git on asennettu oikein.
Muistilista¶
Alla on lyhyt muistilista tyypillisimmistä tällä kurssilla vastaan tulevista tilanteista gitin kanssa. Lue kuitenkin ensin tarkemmat kuvaukset tämän dokumentin seuraavista luvuista.
| Tavoite | Toimenpide | Komento | Linkki ohjeeseen |
|---|---|---|---|
| Aloitan harjoitustyön | Teen fork-toiminnolla gitlab.jyu.fi-palvelussa uuden etävaraston. | Hyppää ohjeeseen | |
| Menen koneelle, jossa sisältöä ei vielä ole | Haen GitLabista etävarastoni HTTPS-osoitteen ja kloonaan etävaraston omalle koneelle. Huomaa piste komennon päätteeeksi. | git clone [etävaraston osoite] . |
Hyppää ohjeeseen |
| Menen koneelle jossa sisältö jo on | Päivitän etävaraston version koneelle. | git pull |
Hyppää ohjeeseen |
Muutan tai lisään tiedostoja (esimerkiksi suunnitelmakuva suunnitelma-kansioon) |
(1) Lisään muuttuneet ja uudet tiedostot stage-tilaan, ja (2) siirrän stage-tilan tiedon lokaaliin varastoon | git add --allgit commit -m "Muutoksia kuvaava viesti." |
Hyppää ohjeeseen |
| Lähetän muutokset etävarastoon | Luon tarvittaessa pääsytunnuksen GitLabiin. Sitten lähetän paikallisen varaston muutokset etävarastoon. | git push |
Hyppää ohjeeseen (token), Hyppää ohjeeseen (push) |
Nämä samat ohjeet pätevät myös ryhmätyössä, mutta silloin kannattaa kiinnittää erityistä huomiota siihen, että tekee pull, commit- ja push-toimintoja riittävän usein konfliktien välttämiseksi.
git status-komentoa voi viljellä missä tahansa välissä. Se kertoo paikallisen varaston tilasta, muun muassa mitä tiedostoja on muutettu, poistettu tai lisätty.
Huomautus
Harjoitustyön pohjan viemisestä versiohallintaan on myös vaiheittainen kuvitettu ohje. Voit seurata joko tätä tekstipohjaista ohjetta tai kuvitettua ohjetta. Molempia ei tarvitse lukea.
Oman etävaraston luominen GitLab-palveluun¶
Tässä vaiheessa luodaan henkilökohtainen etävarasto (engl. remote repository) gitlab.jyu.fi-palveluun. Etävarastosta käytetään jatkossa nimitystä origin. Kunkin opiskelijan (tai ryhmätyön) etävarasto perustuu valmiiseen pohjaan, josta tehdään kopiohaara, eli GitLab-terminologiassa fork. Forkkauksen ansiosta saadaan uuteen Git-varastoosi kurssin alkuasetukset.
Tämä vaihe tehdään kurssilla yhden kerran.
- (a) Jos sinulla on JY-tunnukset: Kirjaudu gitlab.jyu-palveluun (https://gitlab.jyu.fi/) JY-tunnuksilla. (b) Jos sinulla ei ole JY-tunnuksia: Tee tunnukset GitHub-palveluun (https://github.com), ja kirjaudu sisään.
- (a) JY: Avaa Ohj1-kurssin pohjaprojekti selaimessa: https://gitlab.jyu.fi/tie/ohj1/ohj1ht (b) Ei-JY: Avaa Ohj1-kurssin pohjaprojekti selaimessa: https://github.com/ITKP102-Ohjelmointi-1/ohj1ht.git
- (a) JY: Valitse oikeasta ylänurkasta
fork(b) Ei-JY: Vastaavasti. - Valitse omaa tunnustasi vastaava
namespace(ryhmä). - Valitse näkyvyydeksi
public. - Tarkista, että
Project slugkohdassa lukeeohj1ht. Jos muutat tätä, niin tämän ohjeen myöhemmät kohdat eivät toimi oikein.
Projektisi etävaraston URL-osoite on nyt (jos sinulla on JY-tunnukset):
tai (jos sinulla ei ole JY-tunnuksia):
Tallenna URL-osoite TIMiin Harjoitustyö -sivulle. TODO: Linkki.
Näet jatkossa oman etävarastosi URL-osoitteen gitlab.jyu.fi-palvelussa kohdasta Clone › Clone with HTTPS. Käytä oman etävarastosi URL-osoitetta tulevissa ohjeissa.
Valinnaista lisätietoa: Mikä fork on?
Tämä teksti kannattaa lukea, kun ymmärrät, mitä commit, push ja pull tarkoittavat.
Fork on itsenäinen kopio olemassa olevasta git-varastosta. Fork säilyttää aikaisemman historian (commitit), ja jatkaa omaa elämäänsä irrallaan alkuperäisestä projektista. Tähän kopioon (fork-projektiin) tehtävät commitit eivät mene alkuperäiseen projektiin, eivätkä alkuperäisen projektin commitit tule kopioon.
Käytännön elämässä fork-projekti tehdään usein tilanteessa, kun kehittäjä haluaa syystä tai toisesta erottaa oman työnsä alkuperäisen projektin työstä. Kehittäjä voi esimerkiksi olla pettynyt projektin suuntaan ja haluaa jatkaa itsenäisesti eteenpäin. Yksi esimerkki tästä ovat striimausohjelmistot OBS Studio ja Streamlabs Desktop: OBS Studio on maksuton, vapaan lähdekoodin (Gnu GPL v2) projekti. Streamlabs forkkasi OBS-projektin vuonna 2014, ja on siitä eteenpäin tuonut omaan forkkiinsa yhä enemmän kaupallisia ominaisuuksia, kun taas OBS jatkaa edelleen ilmaisohjelmiston periaatteella.
Tällä kurssilla forkkaaminen mahdollistaa opiskelijalle helpon tavan perustaa oma Git-repo GitLabiin, ja toisaalta forkin ansiosta opettaja voi samalla jakaa opiskelijoille projektin pohjakoodit (suunnitelmien pohjat jne.) valmiiksi.
Älä sotke fork-termiä branch-termiin. Brancheja käytetään Gitissä aivan eri tarkoitukseen, vaikka myös branch usein suomennetaan haaraksi.
Fork-projektista on viite alkuperäiseen projektiin, siis siihen, josta fork otettiin, jotta alkuperäisestä projektista käsin voidaan seurata mitä haaroja siitä on tehty.
Lisätietoa kiinnostuneille: https://help.github.com/en/github/getting-started-with-github/fork-a-repo
Oikeuksien antaminen muille ryhmäläisille¶
Jos teet harjoitustyön yksin, voit ohittaa tämän kohdan.
Forkin tekijä antaa oikeudet muille ryhmäläisille. Tämä tapahtuu projektin vasemman reunan kohdasta Members. Syötä kohtaan GitLab member or Email address ryhmän jäsenet yksi kerrallaan. Huom! Kaikkien jäsenten tulee olla tätä ennen olla kirjautunut gitlab.jyu.fi-palveluun vähintään kerran.
Kaikki ryhmäläiset käyttävät samaa etävaraston osoitetta. Tämä on otettava huomioon alempana olevissa ohjeissa, joissa tällöin näkyy "väärän" henkilön tunnus.
Omien tietojen (nimi, sähköposti) asettaminen¶
Tämä vaihe tehdään yhden kerran jokaisella tietokoneella jolla harjoitustyötä työstetään.
Versiohallinta liittää jokaiseen muutokseen tiedot muutoksen tekijän nimestä ja sähköpostiosoitteesta. Tästä syystä Git-ohjelmalle täytyy antaa nimi ja sähköposti. Aseta omat tietosi Git-asiakasohjelmaan seuraavasti.
Mene komentoriville (miten avaan komentorivin?) ja aseta tietosi antamalla alla olevat komennot:
(Korvaa lainausmerkkien sisällä olevat tiedot omilla tiedoillasi. Lainausmerkit tulee pitää mukana komennossa.)
git config --global user.name "Olli Opiskelija"
git config --global user.email "olli.o.opiskelija@student.jyu.fi"
Jos ei tulostu virheviestiä, niin komennot ovat onnistuneet.
Lisätietoa kiinnostuneille: git config
Etävaraston hakeminen omalle tietokoneelle (clone)¶
Tämä vaihe tehdään yhden kerran jokaisella tietokoneella jolla harjoitustyötä työstetään.
Seuraavaksi haetaan etävarasto omalle paikalliselle tietokoneelle. Tästä käytetään termiä kloonaaminen (engl. clone). Kloonattuun paikalliseen tietovarastoon tehdyt muutokset voi aikanaan lähettää takaisin etävarastoon; tästä kerrotaan lisää myöhemmässä kohdassa.
Kloonaus tehdään tyhjään hakemistoon.
Entä jos hakemisto ei ole tyhjä?
Mikäli haluat kloonata ei-tyhjään hakemistoon, on tähän ohjeet Gitin keskustelupalstalla, mutta melkein helpompi on tässä vaiheessa:
- nimeä olemassa oleva hakemisto uudelleen
- tee uusi työhakemisto
- tee sinne clone
- siirrä sisältö vanhasta hakemistosta
- poista vanha hakemisto
- jatka kuten muuten kloonin jälkeen
Valitse alta käyttöjärjestelmästi mukainen käyttötapa.
- Avaa
git bash, Pääte, taicmd-komentorivi. Suosittelemme git bashia. -
Tee uusi hakemisto, jonka haluat menevän versionhallintaan, ts. jossa harjoitustyösi tulee sijaitsemaan. Kansion nimi voisi olla esimerkiksi
C:\Users\MunKayttaja\ohj1\ht. Alla on esimerkki uuden kansion luontikomennosta. VaihdaMunKayttaja-sanan kohdalle todellinen kotihakemistosi nimi omassa käyttöjärjestelmässäsi. Se ei ole sama kuin JY-käyttäjänimesi. Jos et tiedä mikä kotihakemistosi nimi on, kirjoita avattuasi git bash aivan ensimmäiseksi komentopwd, joka tulostaa koko kotihakemistosi polun. Sitten kirjoita:mkdir /c/Users/MunKayttaja/ohj1/ht -
Siirry tekemääsi kansioon
cd-komentoja käyttämällä esimerkiksi seuraavasti:cd /c/Users/MunKayttaja/ohj1/htVoit halutessasi vaihtaa
ht-sanan paikalle valitsemasi sanan `harjoitustyo´ tai pelin nimen. Kansion nimen voi vaihtaa myöhemminkin. Kyseinen kansio toimii nyt projektin juurikansiona. Jatkossa kaikki komennot annetaan tässä kansiossa. Paina tarkasti mieleen kansion sijainti, sillä tulet tarvitsemaan sitä useita kertoja harkkatyötä tehdessä! -
Anna komentoriviltä tässä kansiossa komento. Huomaa välilyönti ja piste lopussa, nekin on annettava.
git clone https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git . -
Antamalla komennon
ls -lanäet, että hakemistoon haettiin pohjaprojektin tiedostot
.gitignore,README.mdsekä kansiosuunnitelma..gitignore-tiedosto sisältää tiedot sellaisista tiedostoista, joita ei oletusarvoisesti viedä versionhallintaan. Näitä ovat muun muassa erilaiset väliaikaistiedostot sekä käännetyt tiedostot.README.mdsisältää projektin kuvauksen Markdown-formaatissa.suunnitelma-kansioon laitetaan pelin suunnitelmakuva (tai -kuvat).
- Avaa komentorivi, Pääte tai Terminal.
-
Tee uusi hakemisto, jonka haluat menevän versionhallintaan, ts. jossa harjoitustyösi tulee sijaitsemaan. Järkevintä lienee tehdä hakemisto kotihakemiston alle. Alla on esimerkki uuden kansion luontikomennosta. Vaihda
MunKayttaja-sanan kohdalle todellinen kotihakemistosi nimi omassa käyttöjärjestelmässäsi. Se ei ole sama kuin JY-käyttäjänimesi. Jos et tiedä mikä kotihakemistosi nimi on, kirjoita avattuasi Pääte aivan ensimmäiseksi komentopwd, joka tulostaa koko kotihakemistosi polun. Sitten kirjoita:mkdir /Users/MunKayttaja/ohj1/ht -
Siirry tekemääsi kansioon
cd-komentoja käyttämällä esimerkiksi seuraavasti:cd /Users/MunKayttaja/ohj1/htVoit halutessasi vaihtaa
ht-sanan paikalle valitsemasi pelin nimen. Hakemiston nimen voi vaihtaa myöhemminkin.Kyseinen kansio toimii nyt projektin juurikansiona. Jatkossa kaikki komennot annetaan tässä kansiossa. Paina tarkasti mieleen kansion sijainti, sillä tulet tarvitsemaan sitä useita kertoja harkkatyötä tehdessä!
-
Anna komentoriviltä tässä kansiossa komento. Huomaa välilyönti ja piste lopussa, nekin on annettava.
git clone https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git .
-
Tarkista
ls -la-komentoa käyttämällä että hakemistoon tuli tiedostot.gitignore,README.mdsekä kansiosuunnitelma. -
.gitignore-tiedosto sisältää tiedot sellaisista tiedostoista, joita ei oletusarvoisesti viedä versionhallintaan. Näitä ovat muun muassa erilaiset väliaikaistiedostot sekä käännetyt tiedostot. README.mdsisältää projektin kuvauksen Markdown-formaatissa.suunnitelma-kansioon laitetaan pelin suunnitelmakuva (tai -kuvat).
Lisätietoa: Git-ohje: clone, reference: clone
Tiedostojen vieminen paikalliseen tietovarastoon (add, commit)¶
Kun tiedostoja lisätään, muokataan tai poistetaan, tulee kaikki nämä muutokset lisätä paikalliseen tietovarastoon.
Tämä vaihe tehdään joka kerta kun olet tehnyt muutoksia koodiin tai muihin tiedostoihin.
Esimerkki: Suunnitelman kuvan tallentaminen. Tallenna harjoitustyösi suunnitelman sekä luonnoskuvan suunnitelma-kansioon. Ole tarkkana, että kuva menee oikeasti juuri tuohon kansioon. Sekä suunnitelmatekstiä varten että kuvaa varten on olemassa esimerkit suunnitelma-kansiossa.
Kuvan pikselikoon tulee olla enintään 1920 x 1080 pikseliä. Kuvan tiedostokoon tulee mielellään olla enintään 1 megatavu.
Avaa Pääte (macOS), Git Bash (Windows) tai muu komentorivi, siirry cd-komentoja käyttämällä harkkatyökansioosi ja anna seuraavat kaksi komentoa:
git add --all
git commit -m "kuvaava viesti miksi muutokset on tehty"
Ensimmäinen komento lisää kaikki muokatut tiedostot ns. index/stage-alueelle, ja seuraava komento tekee varsinaisen tietovarastoon tallentamisen.
On tärkeää, että aina add-komennon jälkeen tarkistat git status-komennolla mitä tiedostoja
tietovarastoon on menossa. Älä lähetä tietovarastoihin suuria tiedostoja.
Mikäli et halua lähettää tietovarastoon kaikkia muutoksia, vaan esimerkiksi
vain yhden tiedoston, laita --all-option tilalle haluamasi tiedoston nimi:
git add TIEDOSTONNIMI (hakemistoineen, /-viiva hakemistomerkkinä)
Jotkut pitävät parempana luetella kukin lisättävä tiedosto erikseen edellä mainitulla komennolla. Kummassakin tavassa (all-vipu, tai kukin tiedosto erikseen) on puolensa.
Huomaa, että .gitignore-tiedosto sisältää tiedot sellaisista tiedostoista, joita ei lähtökohtaisesti viedä versiohallintaan. Jos kuitenkin ehdottomasti haluat lisätä tällaisen, esimerkiksi .jar-päätteisen tiedoston, niin silloin on käytettävä -f -optiota, jolla pakotetaan lisäys. Esimerkiksi:
git add -f kerho.jar
Toinen vaihtoehto on erikseen sallia vastava jar lisäämällä .gitignore-tiedostoon
rivin .jar perään rivi:
!kerho.jar
Pääsytunnuksen (token) luominen GitLabiin¶
GitLabin etävarastoon ei voi lähettää muutoksia ilman tunnistautumista. Jotta GitLab tietää, kuka olet, luodaan pääsytunnus (engl. personal access token), jonka annat ensimmäisellä pushilla (seuraava vaihe) salasanan sijaan. GitLabiin ei voi enää lähettää muutoksia salasanaa käyttäen.
Tämä vaihe tehdään jokaisella tietokoneella ennen ensimmäistä pushia.
- Kirjaudu gitlab.jyu.fi-palveluun ja valitse oikeasta yläkulmasta oman kuvakkeesi alta Preferences.
- Valitse vasemmasta valikosta Access › Personal access tokens.
- Avaa Generate token -valikko ja valitse Legacy token.
- Anna tunnukselle nimi, josta tunnistat koneen, esimerkiksi
ohj1-kotikone. - Vaihda Expiration date -kohtaan päivä noin vuoden päähän. Oletuksena tunnus vanhenee jo kuukauden kuluttua.
- Valitse oikeuksista (Select scopes) read_repository ja write_repository.
- Vieritä lomakkeen loppuun ja paina Generate token.
- Kopioi tunnus leikepöydälle kentän vieressä olevalla kopiointipainikkeella. GitLab näyttää tunnuksen vain tämän kerran, joten pidä sivu auki, kunnes push on onnistunut. Et voi kopioida tunnusta myöhemmin, vaan joudut luomaan uuden.
Tunnusta ei tarvitse tallentaa minnekään: Windowsissa ja macOS:ssä Git muistaa sen tällä koneella ensimmäisen pushin jälkeen. Jos hävität tunnuksen, taikka teet harjoitustyötä myös toisella koneella, luot uuden tunnuksen samalla tavalla kuin yllä. Jos kone katoaa, poista sen tunnus GitLabin tunnuslistasta (Revoke); muiden koneiden tunnukset toimivat edelleen.
Varoitus
Pääsytunnus on kuin salasana. Älä kirjoita sitä tekstitiedostoon, suunnitelmaan, koodiin tai viestiin.
Tehtyjen muutosten lähettäminen etävarastoon (push)¶
Tässä vaiheessa paikalliseen tietovarastoon lähetetyt muutokset lähetetään etävarastoon.
Tämä vaihe tehdään joka kerta kun olet tehnyt muutoksia koodiin tai muihin tiedostoihin. Älä unohda tehdä tätä työskentelyn päätteeksi. Muutoin tiedot jäävät vain paikalliseen tietovarastoon.
Avaa Pääte (macOS), Git Bash (Windows) tai muu komentorivi. Siirry harjoitustyökansioosi cd-komentoja käyttämällä ja anna sitten komento
git push
Ensimmäisellä kerralla Git kysyy käyttäjätunnustasi ja
pääsytunnusta. Anna käyttäjätunnus lyhyessä muodossa
käyttäjätunnus ilman @-merkkiä ja loppuosaa.
- Windows: Git Credential Manager avaa kirjautumisikkunan. Valitse Token ja kirjoita käyttäjätunnuksesi. Pääsytunnusta ei kirjoiteta vaan liitetään: napsauta Personal access token -kenttää hiiren oikealla painikkeella ja valitse Paste (tai paina Ctrl + V). Kenttään tulee pelkkiä pisteitä. Windows muistaa tunnuksen, eikä sitä kysytä uudelleen.
- macOS: kirjautumisikkunaa ei ole, eikä tunnuksen ja salasanan välillä
valita. Pääte kysyy ensin
Username, johon kirjoitat käyttäjätunnuksesi, ja sittenPassword, johon liität pääsytunnuksen (Cmd + V ja Enter). Liitetty tunnus ei näy ruudulla. macOS tallentaa sen avainnippuun, eikä sitä kysytä uudelleen. - Linux: kuten macOS:ssä, mutta Git kysyy tunnukset jokaisella pushilla, ellei tunnusten tallennusta ole otettu käyttöön.
Mikäli annat tunnukset väärin, joudut muokkaamaan kirjautumistietojasi, ks. Push ei onnistu (remote: HTTP Basic: Access denied). Sama virhe tulee, kun pääsytunnus vanhenee vuoden päästä. Luo silloin uusi tunnus ja vaihda se vanhan tilalle.
Tarkista tämän jälkeen Gitlab-osoitteestasi, että sieltä löytyy lähettämäsi tiedostot (alkukurssista ne kuvat).
Muutosten hakeminen etävarastosta paikalliseen varastoon (pull)¶
Kun sinä tai joku muu on muuttanut tiedostoja ja vienyt muutoksia etävarastoon, niin muutokset tulee hakea omalle koneelle. Yhteistyöskentelyssä on syytä aina työskentelyä aloittaessa antaa pull-komento.
Siirry hakemistoon, johon olet kloonannut projektin (ks. clone) ja anna komento:
git pull
Tässä kohti voi tulla kysymys siitä, että miten käyttäjä haluaa pull-komennon jatkossa toimivan. Ohj1-kurssin osalta toimiva vaihtoehto on
git config pull.rebase false
Lue tästä lisää esimerkiksi StackOverflowsta.
Git ja ryhmätyöskentely¶
Kun työskennellään ryhmässä esimerkiksi jos teet harjoitustyön parityönä, tulee eräisiin Git-toimintoihin kiinnittää erityistä huomiota, jotta välttyy turhalta työltä. Kun useampi työstää samaa tiedostoa, tulee helposti tilanne, jossa on tehty eri muokkauksia samoille riveille. Tällöin Git ei tiedä mitä tehdä ja konfliktit täytyy ratkaista käsin. Tälläistä tilannetta kutsutaan nimellä merge conflict ja se ilmaantuu, kun omia muutoksia yrittää puskea tai kun muutoksia koitetaan hakea omalle koneelle.
Alla on esitetty tärkeimmät tavat, joilla vältytään ongelmilta, kun työstetään samaa haaraa ryhmänä.
- Kommunikoikaa selkeästi mitä työstätte ja milloin.
- Aina ennen kuin aloittaa koodaamisen, haetaan muutokset etävarastosta
--rebaselipulla, jonka ansiosta omat muutokset asetetaan paikalliseen varastoon vasta etävarastosta haettujen muutosten jälkeen. - Kun viette (push) muutoksia etävarastoon, ilmoittakaa siitä muulle ryhmälle.
Esimerkki merge conflict -tilanteesta
Vaikka noudattettaisiin hyviä käytänteitä, niin välillä merge conflict tulee vastaan silti. Tätä ei kuitenkaan kannata pelätä ja se saadaan ratkaistua esimerkiksi Riderissa. Tässä skenaariossa kaksi kehittäjää muokkaa samaa tiedostoa ja molemmat ovat haarassa main.
Kehittäjä A puskee etävarastoon seuraavan koodin:
public override void Begin()
{
PhysicsObject nelio = new PhysicsObject(100, 100, Shape.Rectangle);
Add(nelio);
}
public override void Begin()
{
PhysicsObject pallo = new PhysicsObject(50, 50, Shape.Circle);
Add(pallo);
}
git push johtaa tämän näköiseen tulosteeseen.
Kehittäjä B hakee muutokset itselleen komennolla git pull --rebase. Tämä komento epäonnistuu kuvassa näkyvällä tulosteella.

Jos tämä komento ajettiin Riderin terminaalissa, niin Rider näyttää ylälaidassa varoituksen merge conflictista. Tästä ilmoituksesta voi klikata Resolve conflicts... nappia, jolloin avautuu Riderin näkymä konfliktien ratkomiseen.

Konfliktin ratkaiseminen editorissa¶
Riderin Merge conflict editor näkymä näkyy alla olevassa kuvassa. Editorissa on kolme ikkunaa. Vasemmalla puolella on Kehittäjän B lokaalit muutokset, eli hänen, joka yritti hakea muutoksia etävarastosta. Oikealla puolella taas näkyy etävarastosta haettu tiedosto. Keskimmäinen ikkuna taas näyttää lopputuloksen.

Nyt Kehittäjän B tulee päättää, säilytetäänkö lokaalit muutokset vai etävarastosta haetut muutokset. Tämä tapahtuu painamalla muutoksen eli punaisella näkyvän alueen kohdalla ikkunoiden välissä näkyvää nuoli symbolia joko vasemmalta(lokaali) tai oikealta(etävarasto) puolelta. Tämän jälkeen valittu muutos siirtyy keskimmäiseen ikkunaan. Kun kaikki konfliktit on ratkaistu tällä tavoin ja lopputulos(keskimmäinen ikkuna) näyttää oikealta, voidaan painaa alakulmasta Apply nappia ja sitten Apply Changes and Mark Resolved.
Tehdään tämä vielä muille mahdollisille tiedostoille, joissa on konflikteja. Lopuksi kun yhtään konfliktiä ei ole enää jälellä, painetaan Riderin yläreunasta vihreää nuolikuvaketta Continue Rebase. Tämän jälkeen Merge conflict on ratkaistu ja Kehittäjä B voi jatkaa työskentelyä normaalisti.
Huomioitavaa¶
Tiedostojen koko¶
Versionhallintajärjestelmä ei sovi suurten tiedostojen tallennukseen. Älä lähetä versiohallintaan esimerkiksi suuria kuva-, musiikki- tai videotiedostoja. Myöskään bin, obj ja vastaavat kansiot (sis. käännetyt ohjelmat ja muut IDE:n tuottamat käännöksen oheistiedostot) eivät kuulu versiohallintaan. Täydennä tarvittaessa .gitignore-tiedostoa.
Älä laita salaisuuksia versiohallintaan¶
Älä lisää projektisi commiteihin mitään salaista, kuten salasanoja tai henkilötietoja. Vaikka poistaisit tiedon seuraavassa commitissa, se jää Gitin projekti-historiaan, ja on löydettävissä julkaisun jälkeen. Mikäli kuitenkin lähetit etävarastoon jotain, jonka haluat poistaa myöhemmin, se onnistuu esimerkiksi BFG Repo-Cleaner-työkalun avulla.
Tapoja käyttää Gitiä¶
Aluksi ehdottomasti suositeltavin tapa on käyttää Gitiä komentoriviltä. On olemassa kuitenkin myös graafisia ympäristöjä Gitin käyttämiseen. Myös IDEissä on nykyään varsin asialliset Git-asiakasohjelmistot (eli käyttöliittymä Git-komentojen käyttämistä varten), joskin jokainen on aina vähän omanlaisensa ja vaatii totuttelua. Kaikkia alla mainittuja työkaluja voit kuitenkin käyttää ristiin. Kannattaa kokeilla eri tapoja. Mikroluokista löytyy ainakin komentorivityökalut, Eclipse sekä TortoiseGit.
Git termejä¶
- repository, suom. säilytyspaikka, tietovarasto tai arkisesti "repo" = Paikka jossa versioitava tieto tallennetaan,
voi olla paikallinen (
local) tai etä (remote). Periaatteessa samasta projektista voi olla samasta projektista useita säilytyspaikkoja niin paikallisesti kuin etänä.local repositoryon käytännössä hakemistossa oleva.git-hakemisto. Repository koostuu loogisesti commiteista, jotka muodostavat kokoelman projektin eri vaiheista. Näin mihin tahansa commitoituun kohtaan voidaan viitata tai tarvittaessa myös palata. - fork = projektista tehty "kopiohaara", joka elää omaa elämäänsä irrallaan alkuperäisestä projektista. Fork ei ole Gitin toiminto, mutta useat ulkoiset Git-palvelimet (kuten GitHub ja GitLab) tarjoavat tämän toiminnon.
- origin = lyhenne käytettävän etävaraston osoitteelle (
remote repository). Jos etäsäilytyspaikkoja on useita, tulee näitäkin useita. - project = jokin selkeä projekti, joka tähtää esimerkiksi jonkin yhden ohjelmatuotteen tekemiseen
- working directory (tai workspace) = työhakemisto, lokaali työhakemisto (kaikki tiedostot ja versiot löytyvät tämän alla olevasta .git -hakemistosta, jos ne on koneelle haettu (fetch))
- index = varastoon seuraavalla commitilla siirrettävien tiedostojen luettelo
(versioitavien, staging area joissakin lähteissä, koska tiedosto laitetaan "näytille").
Käytännössä tiedosto
.git/index. - main = projektin päähaaran oletusnimi, joka pyritään pitämään toimivana koodina. Aikaisemmin päähaaran oletusnimi oli
master.
Vaativampaan käyttöön ja viimeistään Ohjelmointi 2 -kurssilla tarvittavia termejä:
branch= kehityshaara jossa kehitetään uutta koodia. Kehityshaaroja voi olla useita. Kun koodi on hyväksi todettu, se voidaan yhdistää (merge) päähaaraan.tag= jäädytetty haara (esimerkiksi ohjelman tietty versio), jota ei aktiivisesti kehitetä, mutta johon voi tulla esimerkiksi tietoturvapäivityksiäHEAD= viite aktiivisen haaran "päähän" tietyssä lokaalissa
Kurssilla käytettäviä Git-komentoja:
git config --global user.name "käyttäjätunnus"
git config --global user.email "tunnus@student.jyu.fi"
git clone https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git .
git status # tätä komentoa kannattaa käyttää ahkeraan vaikka joka välissä
git log # samoin tätä, kunhan opit lukemaan sen sisältöä
# tee tarvittavia muutoksia
git add --all
git commit -m "Vaihe 1, kuvat"
git push # kaverin pitää tämän jälkeen tehdä kotona tehdä git pull
git pull
Ongelmia?¶
Yleisimpiä ongelmia on lueteltu alla.
remote: The project you were looking for could not be found or you don't have permission to view it.
Annoit git clone -komennolle väärän etävaraston URL-osoitteen. Tarkista etävarastosi osoite gitlab.jyu.fi-palvelussa oman projektisi kohdasta Clone › Clone with HTTPS. Anna tämä osoite git clone -komennon perään.
Syy, miksi näin kävi, johtuu todennäköisesti siitä, että forkkia tehdessäsi muutit Project slugia, eli projektin tunnistetta, joka muuttaa etävaraston URL-osoitetta.
Push ei onnistu (remote: HTTP Basic: Access denied)
Ongelma: Git ei anna viedä mitään etävarastoon (push ei onnistu). Antaa virheilmoituksen:
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'https://gitlab.jyu.fi/NIMI/ohj1ht.git'

Huomaa, että virheilmoitus voi näyttää hieman erilaiselta riippuen siitä käytätkö komentoriviä vai jotain muuta Git-asiakasohjelmaa.
Syy (vaihtoehto 1): Yrität pushata käyttäen JY-salasanaasi. GitLab ei enää hyväksy salasanoja, vaan sinun tulee käyttää pääsytunnusta, eli token-kirjautumista.
Syy (vaihtoehto 2): Etävaraston url-osoitteesta puuttuu lopusta osa .git.
Korjaus: Anna git bashissa / Päätteessä komento git remote -v
Jos fetch- ja push-urlien lopussa ei ole .git-osaa, käy kopioimassa
GitLab-palvelussa varastosi HTTPS-url-osoite, ks. kuva alla.

Anna sitten alla oleva komento, ja pasteta URL-kohtaan äsken kopioimasi osoite.
Kokeile nyt tehdä git push.
fatal: destination path ‘.’ already exists and is not an empty directory
git clone komennon jälkeen antaa tälläisen:
fatal: destination path ‘.’ already exists and is not an empty directory.
Korjaus: Kun tehdään clone, pitää olla tyhjässä hakemistossa.
'[ht]/' does not have a commit checked out, fatal: adding files failed
Poista projektin hakemistosta .git-kansio. (Huom. älä poista ylätason hakemistosta.)
Piilotetut kansiot eivät välttämättä näy tiedostonhallinta-ikkunassa (macOS:lla Finder).
Komentorivillä tuon poisto onnistuu esim
You can't push or pull repositories using SSH until you add an SSH key to your profile
Syy: Kloonatessasi etävarastoa olet todennäköisesti valinnut SSH-osoitteen HTTPS-osoitteen sijaan.
Suositellaan, että otat tässä kohden työstäsi varmuuskopion.
Korjaus, tapa 1:
- Kopioi Gitlab-palvelusta (tai muusta palvelusta) tietovarastosi HTTPS-osoite.
- Avaa komentorivi.
- Siirry cd-komentoja käyttäen harjoitustyösi kansioon.
- Anna komentorivillä komento
git remote. Näyttöön pitäisi tulostua tekstiorigin. Mikäli tulostuu jotain muuta, korvaa seuraavassa kohdassaorigin-sana sillä, mitä sinulle tulostui. - Anna komentorivillä alla oleva komento ja korvaa
UUSIOSOITEkohdassa 1 kopioimallasi osoitteella
Korjaus, tapa 2: Jos tapa 1 ei toimi, voit tehdä uuden clonen uuteen kansioon käyttäen HTTPS-osoitetta, ja kopioida aikaisempaan kansioon tekemäsi muutokset tähän uuteen kansioon. Tämän jälkeen pitää tehdä add- ja commit-komennot uudestaan, sen jälkeen push pitäisi onnistua.
Joskus käy niin että Gitissä tulee touhuttua jotakin mikä saa hommat ihan solmuun. Joihinkin probleemiin vastauksia voi löytyä täältä: https://ohshitgit.com/. Ko. saitin kielenkäyttö ei ehkä sovi perheen pienimmille mutta varsinaiset vinkit voivat pelastaa kiperistä tilanteista.
Lisätietoa kiinnostuneille¶
- Git reference: Git-yhteisön ylläpitämä dokumentaatio Git-komennoille.
- A curious tale - from snaphots to git - tämä ja sen jatko-osa kannattaa lukea, ne selvittävät hyvin Gitin ideaa.
- Pro Git book: Git-yhteisön ylläpitämä Git-kirja.
- Git - Tutorial / Lars Vogel
- Git Handbook
- git - the simple guide
- Helsingin yliopiston Git-kurssi
- git cheatsheet