Git on hajautettu versiohallintaohjelmisto. Versionhallintaohjelmiston ideana on tarjota säilytyspaikka yhteisesti käytettävälle tiedolle ja pitää kirjaa tietoon tehdyistä muutoksista. Ohjelmistotyössä ollaan yleensä pisimmällä tiedon yhteiskäytössä.
Aluksi ehdottomasti suositeltavin tapa on pääteohjaus 1:ssä harjoiteltu Git ja komentorivi.
Kaikkia alla mainittuja tapoja (työkaluja) voit kuitenkin käyttää ristiin sekä kotona että mikroluokissa. Kannattaa kokeilla eri tapoja.
Listasta puuttuu GitHub Desktop, joka nimestään huolimatta toimii muullekin kuin GitHubiin laitetuille varastoille. Linux-versiota ei löydy, mutta Windows- ja macOS-versio on erinomainen git-client. https://desktop.github.com
—Asenna em kohdista ainakin komentoriviin liittyvät asiat. Voit asentaa myös muita jos siltä tuntuu.
✅ Nyt saat ruksia asennetuksi kohdan: Git

yhden kerran: luodaan oma remote repository (kurssilla: fork)
jos mennään koneelle, jossa sisältöä ei vielä ole, kloonataan remote omaan koneeseen
git clone https://gitlab.jyu.fi//ohj2.gitjos mennään koneelle jossa sisältö jo on, haetaan työn aluksi aina uusin sisältö remotesta
git pullkun työ lopetetaan, lisätään (stage) muuttuneet/uudet tiedostot
git add --all
ja sitten tehdään siirreään ne lokaaliin varastoon
git commit -m "muutoksia kuvaava viesti"
ja lopuksi talteen etävarastoon
git pushGitin yksi oleellinen ero esimerkiksi SVN:ään on se, että varastoista (repository) voi olla useita kopioita lokaalisti ja etänä. Lokaalivarasto voidaan kopioida etävarastoon (remote repository) ja sieltä edelleen toiseen lokaaliin varastoon. Lisäksi etävarastojakin voi olla useita. Tämän takia komentoja on enemmän svn:ään verrattuna.
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.
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.origin = lyhenne käytettävän etävaraston osoitteelle (remote repository)project = jokin selkeä projekti, joka tähtää esimerkiksi jonkin yhden ohjelmatuotteen tekemiseenworking 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.master = projektin päähaara, joka pyritään pitämään toimivana koodinabranch = 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ä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.HEAD = viite aktiivisen haaran “päähän” tietyssä lokaalissaKurssilla käytettäviä Git-komentoja:
git config --global user.name ""
git config --global user.email ""
git clone https://gitlab.jyu.fi//ohj2.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ää kotona tehdä git pull
# näytä ohjaajalle, jos muutoksia jatka kohdasta "tee tarvittavia"
git tag -a vaihe1
git push --tags
# seuraava_vaihe:
git branch tyo2
# tehdään vaihetta
git checkout tyo2
git push -u origin tyo2
# tee uutta koodia, pidä huoli että .gitignore on olemassa
git add --all
git add -f kerho.jar # pakotetaan käytetyn .jar:in lisäys
git commit -m "vaihe 2 selitys"
git push # kaverin pitää kotona tehdä git pull ja git checkout tyo2
# jos vaihe ei vielä valmis, jatka kohdasta "tee uutta koodia"
git checkout master
git merge tyo2
git push # kaverin pitää kotona tehdä git pull ja git checkout master
# näytä ohjaajalle, jos muutoksia jatka kohdasta "tehdään vaihetta"
git tag -a vaihe2
git push --tags # kaverin pitää kotona tehdä git pull
# Jatka kohdasta "seuraava_vaihe", kasvata vaiheen numeroa (eli käytä 2 tilalle
toista numeroa)
Fork on projektista tehtävä itsenäinen “haara”, joka jatkaa omaa elämäänsä, mutta josta on viite alkuperäiseen projektiin ja alkuperäisestä voi seurata mitä “forkkeja” siitä on tehty. Forkin ansiosta saadaan uuteen projektiin samat alkuasetukset.
Kirjaannu gitlabiin https://gitlab.jyu.fi/ JY:n tunnuksilla
Mene gitlabin Ohj2-pohjaan: https://gitlab.jyu.fi/tie/ohj2/2020k/ohj2
gitlab.com, niin forkattava osoite on:Valitse oikeasta ylänurkasta fork 
Jos tulee valittavaksi useampia namespaceja (ryhmiä), valitse omaa tunnustasi vastaava.
Hetken päästä aukeaa uusi sivu. Ota sen vasemmasta reunasta Settings.
Jos teet ryhmässä, niin lisää vielä Members/Invite member-kohdasta muiden ryhmäläisten käyttäjätunnukset ja vastaavasti oikeuksiksi Maintainer. Ryhmäläisten pitää olla ensin kirjaantunut ainakin kerran gitlabiin.
Ota Settings/General/Visibility, project features, permissions ja tarkista että projektilla on julkinen näkyvyys.
Projektisi remote repository on nyt
https://gitlab.jyu.fi//ohj2.git
Käytä tätä nimeä tulevissa ohjeissa. Muista lisätä tämä polku projektisi suunnitelmaan, niin ohjaajat löytävät sen.
Jatka tekemällä tästä lokaali klooni (local repository) koneeseesi: clone
Ilmeisesti Cisco VPN ei päästä tähän Helsingistä vaan tämä pitää tehdä kampusverkon puolella?
—Olen tehnyt forkin ja kloonin ja kolmella eri koneella kloonannut ja sen jälkeen kokeillut push jne. Nyt menin gitlab omaan projektiin ja huomasin, että sivun ylälaidassa on oranssi nauha SSH käyttö ei ole mahdollista pull/push ennen kuin profiiliin lisätään SSH key. Liittyykö tämä siihen että istun parhaillaan intranetissä oman organisaation palomuurien sisällä vai mistä on kyse? Huomauttaako se vain siitä että en käytä SSH replikointiin? Ei kai tarvikaan? Eli tuo varoitus voidaan laittaa tilaan don´t show again?
VL: tuo liittyy siihen että jos haluaa käyttäää Gitiä ssh-protokollan yli, meilä käytetään https:n kautta, jolloin ei tarvita noita avaimia.
Hakemistorakenne koneen levyllä pitää olla tyyliin:
c:\MyTemp\vesal\ohj2\ht
.git
.gitignore
README.md
src
kerho
Jasen.java
Jasenet.java
...
kuvat
paaikkuna.png
...Harjoittelin nyt tätä pääteohjaus 1 git-tehtäviä parilla uudella koneella. Olisi kysymys tuosta .git polkurakenteessa. kaikki menee muuten kuten mallirakenteessa mutta .git ei näy. Missä vaiheessa sen olisi pitänyt tulla? Tuo lokaali klooni jne teki vain .gitignore
VL: katso työkalujen pääsivulta miten laitetan piilotoedostot näkyviin. Ne ei Windowsin oletuksilla näy.
Jokainen tekee oman haaransa ja sen alle jokaista vaihetta varten oman haaran.
Alla olevassa mallissa tehty “projektille” vesal (korvaa vesal omalla tunnuksellasi ja tietysti kerho, Jasen jne oman työsi vastaavilla nimillä).
gitlab.jyu.fi/vesal/ohj2
master
.gitignore
README.md
src
kerho
Jasen.java
Jasenet.java
...
kuvat
paaikkuna.png
...
files.txt
tags
vaihe1
vaihe2
vaihe3
vaihe4
vaihe5
vaihe6
vaihe7
jsp
Joku haara (branch) on se missä tehdään koko ajan hommia. Sen alla on tarvittavat paketit (esimerkissä vain kerho, mutta niitä voi olla enempikin ja niitä voi olla sisäkkäin).
Kun vaihe tulee valmiiksi, tehdään siitä vaihetta vastaava tag eli masterkopioidaan sen vaiheen haaraan. Vaihe tarkistetaan aina master-haarasta HT:tä näytettäessä ja kun vaihe on hyväksytty, tehdään se tag.
Tässä luvussa pyritään kuvaamaan hieman enemmän Gitin sisäistä toimintaa.
Muistetaan että kukin commit on “kopio sen hetkisestä työhakemiston sisällöstä”. Tai tarkemmin stagessa (index) commitointi hetkellä oleesta sisällöstä. Commitissa syntyy tiedostoista kopiot .git/objects hakemistoon. Itse commitit sisältävät viitteitä näihin kopioihin. Jokaisesta commitista on myös viite edelliseen committiin. Rinnakkaisten haarojen yhdistämisen jälkeen taakseviitteitä voi olla useampiakin.
Komennot switch (uudemmissa Giteissä) tai checkout siirtävät tietyn commitin sisällön työhakemistoon.
Alla työn vaiheet kuvaavat Ohj2 kurssin työvaiheita silloin, kun ei pääse syntymään rinnakaisia haaroja. Niistä erikseen kuvia muualla.
Seuraavissa kuvissa on vihreillä laatikoilla merkitty committeja (nimetty c1, c2 ja c3) ja soikeilla laatikoilla nimettyjä viitteitä. Kuvissa ei pyritä kuvaamaan kopioitujen tiedostojen sisältöjä, vaan kukin commit ajatellaan, että se tavalla tai toisella sisältää tiedot kopioiduista tiedostoista.
“Mystiset” kirjainsarjat laatikoissa kuvaavat committia vastaavan hash-arvon alkuosaa. Näitä hash-arvoja voit katsoa esim kutsulla:
git log
tai ehkä vielä paremmin näkee missä HEAD ja haarat ovat:
git log --graph --abbrev-commit --decorate
Hash-arvot tulevat, kun lasketaan sha1-hash -arvo committiin liittyvistä identifioivista tekijöistä (mm. sisältö, tekoaika ja tekijä).
Esimerkiksi kahden commitin jälkeen local repository (.git-hakemisto) voisi olla loogisesti alla olevan näköinen.
Oletuksilla toistaiseksi käytössä on vain yksi haara (master) ja HEAD viittaa siihen.
Jos luodaan uusi haara (vaikkapa tyo2), mutta ei vielä tehdä mitään muuta, niin HEAD säilyy päähaarassa.
git branch tyo2
Komennolla
git switch tyo2
viite HEAD siirtyy työhaaraan
Mikäli sinulla on käytössä vanhempi versio gitistä josta switch-komento puuttuu, käytä komentoa
git checkout tyo2
Kun commitoidaan jotakin uutta, syntyy uusi commit, jota työhaara oletuksena seuraa (jos se on aktiivinen haara)
git commit -m "Korjattu selostusta"
Jos siirrytään takaisin master-haaraan, siirtyy HEAD sinne:
git switch master
Jos ennen master-haaran muuttamista tehdään tagi, se jää osoittamaan tähän kohtaan
git tag vaihe1
Kun työhaara yhdistetään masteriin, on kaikki taas samassa paikassa (ellei johonkin ole lisätty välillä jotakin uutta):
git merge tyo2
Lokaalin repositoryn puskeminen (push) tekee tästä kopion remote repositoryyn tai päivittää sitä, jos se on jo olemassa.
Vastaavasti remote repositoryn clone tekee siitä kopion toiseen lokaaliin repositoryyn.
Komennot pull ja fetch vastaavasti päivittävät kerran kloonatun repositoryn sisältöä. Työhakemiston sisältö riippuu siitä, missä kohti HEAD on menossa. Eli välttämättä työhakemiston sisältö ei muutu, kun lokaali repository päivitetään.
Oletetaan että kaveri on hakenut remotesta itselleen tuon edellisen kuvan mukaisen tilanteen
Kun tilanne haetaan omaan lokaaliin komennolla
git fetch
on kuva suuripiirtein seuraavan näköinen:
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.