Git-versiohallinta Ohjelmointi 1 -kurssilla

Tässä dokumentissa kerrotaan miten harjoitustyön koodia ja muita tiedostoja, kuten suunnitelmakuvia, käsitellään versiohallinnan avulla.

Asenna kehitystyökalut ja Git-versiohallinta ennen tämän ohjeen käyttämistä.

Jotta saat suunnitelman onnistuneesti GitLabiin, sinun on toimittava kappaleiden 3-8 ohjeiden mukaan.

Harjoitustyön suunnitelman viemisestä versiohallintaan on myös videotutoriaali, ks. https://youtu.be/MQJ69rmd1sw. Huomaa, että videolla projektin alku tehdään käyttäen Visual Studiota, mutta voit tehdä projektin aivan vastaavasti myös Riderilla.

(Syksyn kurssilla suunnitelmat kirjoitetaan TIMiin, kuvat laitetaan GitLabiin.)

Kevään kurssilla harjoitustyön suunnitelma kirjoitetaan Gitiin suunnitelma.md-tiedostoon; tarkemmat ohjeet ovat yllä olevalla videolla. Syksyn kurssilla suunnitelma kirjoitetaan TIMiin, ja README.md-tiedostoon laitetaan suunnitelman linkki. Suunnitelman saa tehdä myös README.md-tiedostoon. Muuten video osittain pätee syksynkin kurssilla

1. Mikä Git on

Git on hajautettu versiohallintaohjelmisto. Versionhallintaohjelmiston ideana on tarjota säilytyspaikka yhteisesti käytettävälle tiedolle ja pitää kirjaa tietoon tehdyistä muutoksista. Ohjelmistotyössä versiohallinnan käyttäminen yhteistyöskentelyyn ja muutosten jäljittämiseen on normi.

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.).

Toisaalta versiohallinta toimii myös varmuuskopiona työllesi. Näin koodisi ei häviä, vaikka tietokoneesi hajoaisi.

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.

GitLab (ja myös GitHub) ovat internetissä toimivia palveluita, joissa Git-muotoisia varastoja (engl. repository) voidaan säilyttää.

Tällä sivulla on kunkin Git-komennon aluksi linkki myös ohjeeseen ja referenssiin. Niitä ei kannata ehkä klikkailla ensimmäisellä lukukerralla, vaan sitten kun haluaa tietää asiasta lisää.

# muistilista

2. 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.

  • Aloitan harjoitustyön ➔ Teen fork-toiminnolla gitlab.jyu.fi-palvelussa uuden etävaraston.

  • Menen koneelle, jossa sisältöä ei vielä ole ➔ Kloonaan etävaraston omaan koneeseen.

    git clone https://gitlab.jyu.fi/Anonymous/ohj1ht.git .
  • Menen koneelle jossa sisältö jo on ➔ Päivitän etävaraston version koneelle.

    git pull
  • Muutan tai lisään tiedostoja (esimerkiksi suunnitelmakuva suunnitelma-kansioon) ➔ Lisään muuttuneet ja uudet tiedostot stage-tilaan,

    git add --all

    ja siirrän stage-tilan tiedon lokaaliin varastoon,

    git commit -m "Muutoksia kuvaava viesti."

    ja "pusken" tekemäni commitin etävarastoon.

    git 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.

Alla on kuvio, jossa on havainnollistettu muutamia yleisimpiä git-komentoja.

Muutamia yleisimpiä git-versiohallinnan komentoja.
Muutamia yleisimpiä git-versiohallinnan komentoja.

Näitä komentoja voit kokeilla Ohjelmointi 2 -sivulla, jossa on luotu Timiin Git-"leikkikenttä" jossa komentojen kokeileminen on turvallista.

stage = näyttämö, vaihe; ajattele, että add-komennolla valitset tai kokoat yhteen tiedostot seuraavaa vaihetta varten

commit = sitoutua; ajattele, että commit-komennolla sitoudut tekemiisi muutoksiin

Komennot push ja pull sitten siirtävät muutokset, joihin olet sitoutunut, muiden saataville (push), tai hakevat muiden tekemeät muutokset sinulle (pull)

07 Feb 23 (edited 07 Feb 23)

Kun yritän saada git push komennolla komentoriviltä gitlabiin korjaukset tallennettua saan tämän herjauksen aina "To https://gitlab.jyu.fi/hesalone/ohj1ht.git ! [rejected] main -> main (fetch first) error: failed to push some refs to 'https://gitlab.jyu.fi/hesalone/ohj1ht.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details." Olen kloonannut gitlabin asiat koneelleni jo kertaalleen (ei anna tehdä uudelleen) mutta en tiedä mikä tämä ongelma on tai miten ratkaista sitä.

04 Apr 24 (edited 04 Apr 24)
# fork

3. Oman etävaraston luominen gitlab-palveluun

Tässä vaiheessa luodaan henkilökohtainen etävarasto (engl. remote repository) gitlab.jyu.fi-palveluun. Tämä on jatkossa sinun työsi (tai ryhmäsi työn) origin. Kunkin opiskelijan 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.

    1. Jos sinulla on JY-tunnukset: Kirjaudu gitlab.jyu-palveluun (https://gitlab.jyu.fi/) JY-tunnuksilla.
    2. Jos sinulla ei ole JY-tunnuksia: Tee tunnukset GitHub-palveluun (https://github.com), ja kirjaudu sisään.
    1. JY: Avaa Ohj1-kurssin pohjaprojekti selaimessa:
      https://gitlab.jyu.fi/tie/ohj1/2023s/ohj1ht (syksyn toteutus) tai
      https://gitlab.jyu.fi/tie/ohj1/2024k/ohj1ht (kevään toteutus)
    2. GitHub: Avaa Ohj1-kurssin pohjaprojekti selaimessa:
      https://github.com/ITKP102-Ohjelmointi-1/ohj1ht.git
    1. JY: Valitse oikeasta ylänurkasta fork
    2. GitHub: Vastaavasti.

  1. Valitse omaa tunnustasi vastaava namespace (ryhmä).
  2. Valitse näkyvyydeksi public.
  3. Päivitä oman maun mukaan Settings --> General-kohdasta esimerkiksi projektisi nimi ja kuvaus. Näiden muuttaminen onnistuu toki myöhemminkin.

Projektisi etävaraston URL-osoite on nyt:

https://gitlab.jyu.fi/Anonymous/ohj1ht.git

Kevään kurssi: Tallenna URL-osoite Omat tiedot -sivulle. Syksyn kurssi: Tallenna URL-osoite suunnitelmasi -sivulle niihin kohti, joissa viitataan Gitiin.

Näet oman etävarastosi URL-osoitteen gitlab.jyu.fi-palvelussa kohdasta Clone -> Clone with HTTPS. Käytä oman etävarastosi URL-osoitetta tulevissa ohjeissa.

Lisätietoa kiinnostuneille: Mikä fork on?

4. 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! 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.

# omattiedot

5. Omien tietojen (nimi, sähköposti) asettaminen

Tämä vaihe tehdään yhden kerran jokaisella tietokoneella jolla harjoitustyötä työstetään.

Versiohallinta säilyttää tiedot muutoksen tekijän nimestä ja sähköpostiosoitteesta.

Aseta omat tietosi git-asiakasohjelmaan seuraavasti.

  • Mene komentoriville ja aseta tietosi antamalla alla olevat komennot:

    git config --global user.name "Anonymous user"
    git config --global user.email "None"
  • Jos ei tulostu virheviestiä, niin komennot ovat onnistuneet.

  • Lisätietoa kiinnostuneille: git config

# clone

6. 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ää kohdassa 8.

Kloonaus tehdään tyhjään hakemistoon.

Entä jos hakemisto ei ole tyhjä?

Valitse alta käyttöjärjestelmästi mukainen käyttötapa.

6.1 Git Bash tai cmd-komentorivi (Windows)

6.2 Komentorivi, Pääte/Terminal (macOS, Linux)

# addcommit

7. Tiedostojen vieminen paikalliseen tietovarastoon (add, commit)

Kun tiedostoja lisätään, muokataan tai poistetaan, lisätään kaikki nämä muutokset lokaaliin tietovarastoon.

  • Git-ohje: add, reference: add

Tämä vaihe tehdään joka kerta kun olet tehnyt muutoksia koodiin tai muihin tiedostoihin.

7.1 Muista: Tallennathan suunnitelman oikeaan paikkaan

Tallenna harjoitustyösi suunnitelman sekä luonnoskuvan suunnitelma-kansioon. Sekä suunnitelmatekstiä varten että kuvaa varten on olemassa esimerkit suunnitelma-kansiossa.

Huomioitavaa:

  1. Kuvan pikselikoon tulee olla enintään 1920 x 1080 pikseliä.
  2. Kuvan tiedostokoon tulee olla enintään 500 kilotavua (500 kB).

7.2 Komentorivi tai Git Bash (suositus, Windows, macOS, Linux)

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

Joissakin lähteissä index/stage-tilaan lisäämisestä käytetään verbiä stage tai staging.

# push

8. 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 sinulta kysytään käyttäjätunnusta ja salasanaa. Valitse kirjautumisikkunassa muodoksi salasana.

Anna käyttäjätunnus lyhyessä muodossa Anonymous ilman @-merkkiä ja loppuosaa. Salasana on se, jota käytät JY-verkossa.

Mikäli annat salasanan väärin, joudut muokkaamaan kirjautumistietojasi, ks. kohta 12.

MacOS-käyttäjät huomatkaa, että salasana on KIRJOITETTAVA vaikka sen kohdalla näkyisi avaimen kuva. Kun salasanaa kirjoitetaan, ei näyttöön tule mitään. Lopuksi on painettava enter. Jos tässä tulee virhe, niin gitlab-salasana on poistettava avainnipusta.

Tarkista tämän jälkeen Gitlab-osoitteestasi, että sieltä löytyy lähettämäsi tiedostot (alkukurssista ne kuvat).

# pull

9. Muutosten hakeminen etävarastosta paikalliseen varastoon (pull)

Kun joku toinen (tai sinä jollain toisella tietokoneella) on muuttanut tiedostoja ja pushannut muutokset 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.

# huomioitavaa

10. Huomioitavaa

# tiedostonKoko

10.1 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.

10.2 Ä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.

11. Tapoja käyttää Git:iä

Aluksi ehdottomasti suositeltavin tapa on Git ja komentorivi.

Kaikkia alla mainittuja tapoja (työkaluja) voit kuitenkin käyttää ristiin. Kannattaa kokeilla eri tapoja. Mikroluokista löytyy ainakin komentorivityökalut, Eclipse sekä TortoiseGit.

Asenna näistä kohdista ainakin komentoriviin liittyvät asiat. Voit asentaa myös muita jos siltä tuntuu.

Gitissä on 4 tärkeää "tilaa", joiden välillä tietoa liikutetaan: working directory, index/stage, local repository ja remote repository. Alla olevassa kuvassa on esitetty tärkeimmät komennot tähän liikutteluun. Kaikista tärkeimmät niistä punaisilla nuolilla. Kuvassa keltaisella on merkitty omassa koneessa olevia tiloja ja sinisellä viitataan edellisen kuvan palvelimeen.

# umlGIT
HUOM! Tätä kuvaa ei pidä tulkita UML:än sekvenssikaavioksi!working directoryindex/stagelocal repositoryremote repositoryworking directoryindex/stagelocal repositoryremote repositoryclone <osoite>Annetaan kerran/koneadd --allKun tiedostot muuttuneetcommit -mpushpull or rebaseKun tasataan kaverin kanssafetchmergecheckout HEADcheckoutdiff HEADdiff
# terms

11.1 Git termejä:

  • repository = (tieto)varasto, paikka jossa versioitava tieto tallennetaan, voi olla lokaali (local) tai etä (remote), kumpiakin voi gitissä olla useita. local repository on käytännössä hakemistossa oleva .git-hakemisto. Repository koostuu loogisesti "commiteista", jotka muodostavat kokoelman projektin eri vaiheista, haaroista ja tageistä. Näin mihin tahansa commitoituun kohtaan voidaan viitata tai palata.
  • fork = projektista tehty "kopiohaara", joka elää omaa elämäänsä (tällä kurssilla). 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)
  • project = jokin selkeä projekti, joka tähtää esimerkiksi jonkin yhden ohjelmatuotteen tekemiseen
  • working directory = työhakemisto (workspace joissakin dokumeteissa), lokaalin koneen 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äähaara, joka pyritään pitämään toimivana koodina (aikaisemmin 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

commit = sitoutua, eli commit-komennolla sitoudut tekemiisi muutoksiin tallentamalla ne varastoon.

07 Feb 23 (edited 07 Feb 23)

Kurssilla käytettäviä Git-komentoja:

git config --global user.name "Anonymous"
git config --global user.email "None"    
git clone https://gitlab.jyu.fi/Anonymous/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

12. Ongelmia?

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.

Joitain muita ongelmia on lueteltu alla.

Push ei onnistu (remote: HTTP Basic: Access denied)

fatal: destination path ‘.’ already exists and is not an empty directory

'[ht]/' does not have a commit checked out, fatal: adding files failed

You can't push or pull repositories using SSH until you add an SSH key to your profile

13. Lisätietoa kiinnostuneille

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.