Nämä harjoitukset jakautuvat kahteen osaan: etukäteen yksin tehtäviin, ja pajassa ryhmässä tehtäviin. Pahoittelemme "branchi repositoryn trunkista" -kieltä, suomennokset eivät ole vakiintuneet tai niitä ei ole.
Tehtäviä tehdessä on paras lukea Git Community Bookia. Vastaukset tehtäviin ovat siellä.
Myös aina hyödyllisiä ovat man-sivut. Gitin tapauksessa komentokohtaiset man-sivut aukeavat komennolla man git-komento
, esim. komennon git init
man-sivu on git-init
.
Etukäteistehtävät eivät ole vitsi: jos alat tekemään niitä vasta ryhmätehtäväpajassa, et ehdi tekemään ryhmätehtäviä. Jos muut ryhmäläiset ovat tehneet etukäteistehtävät, he alkavat tekemään ryhmätehtäviä etkä pysy mukana ja käytännössä loisit ryhmän mukana oppimatta mitään.
Jos olet aiemmin käyttänyt eri versionhallintaa (kuten SVN), mutta tietty muutenkin: tässä lyhyt Git-filosofia. Pidempi filosofia löytyy kurssin vanhoista Git-luentokalvoista.
Git ei ole perinteinen verionhallinta, vaan työkalu oman versiointityönkulun rakentamiseksi. Git on myös tiedostojärjestelmä. Git on MacGyver.
Git on hajautettu: jokainen työkopio on samalla repository (joka usein on kloonattu toisesta repositorysta komennolla git clone
). Commitit menevät aina paikalliseen repositoryyn (nopeaa), josta ne tarvittaessa pushataan mahdolliseen emo-repositoryyn (esim. GitHub).
Gitissä on työkopion/hakemiston lisäksi indeksi, johon kerätään commitoitavat tiedostot. Aloittelijan hyvä git-perustyönkulku on seuraava looppi.
git pull
(hae mahdolliset muiden tekemät muutokset emo-repositorysta)git add [tiedostot]
(lisää muokatut/uudet tiedostot indeksiin)git commit -m "fixed issue: megatron too small"
git push
Kohdan kolme (git add
) voi enimmäkseen ohittaa, eli Gitiä voi käyttää SVN:n tapaan ilman indeksiä:
git pull
git add [uudet tiedostot]
(lisää ainoastaan uudet tiedostot indeksiin)git commit -a -m "fixed issue: megatron still too small"
git push
Oheinen kuva ja sen takana oleva linkki valottaa asiaa.
Tee etukäteen nämä komentorivi- ja Git-näppäilyharjoitukset, niin harjoituksissa tajuat mistä on kyse.
Kirjaudu koneelle users.cs.helsinki.fi
. Myös legacy-alias db
toimii.
Jos kyllästyttää naputtaa jatkuvasti salasanaa (kotikoneelta kirjautuessa), niin tee itsellesi SSH-avain. Laitoksen koneilta toisille pääsee nykyään automaattisesti ilman salasanakyselyä.
Luo tyhjä git-repository käyttäen komentoa git init --bare REPOSITORYN_NIMI
. Huomaa --bare; ilman sitä repositoryyn pushaus ei oletuksena toimi!
Voit tehdä repositoryn mille koneelle tahansa, mutta suosittelemme hallittavuuden ja harjoituksen vuoksi, että
Ota repositorysta itsellesi työkopio nykyiselle koneelle komennolla git clone
, käyttäen ssh://
-URLia (on oletus, joten "ssh://" voi jättää pois).
fatal: '~SAMPUMON/git/megatron.git' does not appear to be a git repository
– Todennäköisesti URL on väärin. Ks. "man git-clone", selaa alaspäin "GIT URLS".Konffaa (aseta/konfiguroi) työkopion git-asetukset: nimi ja email.
git config --list
listaa asetukset.user.email
on sähköpostiosoitteesi. Esim. GitHub käyttää sitä käyttäjä-id:nä, jonka perusteella commitit yhdistetään GitHub-käyttäjään.user.name
kuuluu olla koko nimesi, ei käyttäjätunnus.git config user.name "Sampumon Megatron"
git config --global …
.Lisää työkopioon tiedosto. Esim. echo initial nugget >> nuggets.txt
.
git status
näyttää, mitä muutoksia työkopiossa on, joita ei ole vielä commitoitu.Jännittävä vaihe: add
, commit
, push
.
man git-add
:
This command updates the index using the current content found in the working tree, to prepare the content staged for the next commit. …
The "index" holds a snapshot of the content of the working tree, and it is this snapshot that is taken as the contents of the next commit. Thus after making any changes to the working directory, and before running the commit command, you must use the add command to add any new or modified files to the index.
-m
annettavan commit messagen. Jos yrität commitoida ilman viestiä, joudut vim-editoriin josta ei pääse pois.git push origin master
. Jatkossa pelkkä push
riittää.Kun sait edellisen tehtyä (push meni läpi), kokeile:
git remote -v
kertoo, mistä repositorysta tämä työkopio-repository pullataan (fetch) ja mihin pushataan (yleensä sama kuin fetch).git branch -a
listaa paikalliset (local) ja etä (remote) branchit. Tähti * merkkaa työkopioon tällä hetkellä haettua (checkout) branchia.Kokeile myös graafisella git-työkalulla mitä on tullut tehtyä. Valitse mieluisin seuraavista.
Ota repositorysta työkopio jollekin toiselle koneelle, esim. kotikoneelle. Komento on sama kuin aiemmin.
Lisää repositoryyn kamaa toisen työkopion kautta ja hae muutokset (pull) ensimmäiseen työkopioon.
Jatka kokeilua, kunnes tunnet olosi kotoisaksi.
Selaa tehtävät etukäteen ja kokeile tarvittavien komentojen käyttö jo ennen harjoituksia. Kokeiltavia komentoja:
git log --stat
, git log --graph
git diff
, git diff HEAD^ HEAD
git difftool --tool=meld ...
suorita sama diff ulkoisella diff-työkalulla, (laitoksen) Ubuntuissa Meld.git branch
, git checkout
, git merge
. Ks. Git Book.Muodostetaan kolmen (3) hengen pienryhmiä ja tehdään tehtävät. Kahden hengen ryhmä on ok, neljän hengen ei.
Luokaa ryhmällenne yhteinen emo-repository. Käytönnössä yksi ryhmäläisistä luo repositoryn koneelle users.cs ja antaa muille ryhmäläisille luku- ja kirjoitusoikeudet repositoryyn.
Luo jaettu emo-git-repository koneen users.cs
kotihakemistoosi. Käytä komentoa: git init --bare --shared=0666 REPOSITORYN_NIMI
. Näin repositoryn tiedostoille tulee (nyt ja jatkossa) luku- ja kirjoitusoikeudet kaikille.
tktl
, ja johon kuuluu vain kyseisen ohtuprojektin jäsenet.group
että others
), jotta muodostamamme adhoc-ryhmän jäsenet, niin pää- kuin sivuaineopiskelijat, pääsevät käsiksi repositoryyn.--shared
-parametrilla, vaan asettaa tiedosto-oikeudet käsin: chmod -R a+rwX
, niin oikeudet asetetaan vain kerran ja jatkossa uusille tiedostoille/hakeistoille tulee umaskin mukaiset oletusoikeudet, eikä siten kirjoitusoikeuksia muille. Git-repository on kuitenkin luonteeltaan write-only, ja toimii chmod-menettelyllä kunnes ensimmäistä kertaa hakemistossa objects hashin kaksi ensimmäistä merkkiä törmäävät, ja uusi blob yritetään kirjoittaa jo olemassa olevaan hakemistoon, johon ei ole kirjoitusoikeutta jos se on jonkun muun ryhmäläisen commit/pushin johdosta luotu.Anna myös hakemistoon siirtymisoikeudet (chmod a+x
) koko hakemistopolulle luomaasi git-repositoryyn, alkaen users.cs -koneen kotihakemistostasi. Eli jos repositoryn polku on /home/sampumon/git/megatron.git
, anna a+x
-oikeudet lihavoiduille hakemistoille.
HOX! Jos alla repositorya kloonatessa tulee virhe fatal: '~sampumon/git/megatron.git' does not appear to be a git repository
ja ls -la ~
näyttää users.cs-koneella kotihakemiston oikeusrimpsun lopuksi +-merkin, niin hakemisto-oikeuksia tulee hieroa lisää. Toimi näin:
setfacl -m group::--x,other::--x ~ ~/git
läpikulkuoikeuden tarvittaviin hakemistoihin users.cs-koneella.git clone
uudestaan!Hae yllä luodusta ryhmän yhteisestä repositorysta itsellesi omalle koneellesi työkopio SSH:n yli.
git clone
, mutta URL on oleellisesti eri, koska repository ei ole omassa users.cs-kotihakemistossasi (paitsi repositoryn luoneella kaverilla).git clone KTUNNUS@users.cs.helsinki.fi:~SAMPUMON/git/megatron.git
.sampumon
.Lisätkää repositoryyn yksi tiedosto ja kokeilkaa, että saatte sen commitoitua ja pushattua, sekä pullatkaa muiden tekemät muutokset.
Valmis! Tätä ryhmän yhteistä repositorya käytetään kaikissa lopuissa tehtävissä.
On annettu "Shortcat".
/\___/\ / \ | # # | \ @ | \ _|_ / / \______ / _______ ___ \ |_____ \ \__/ | \__/ | | / \ / ____ \ | / \ | | | | | / | | \ \__/ \__/ Shortcat.
Yksi ryhmän jäsen laittaa Shortcatin repositoryyn tiedostoon shortcat.txt
.
Muut ryhmän jäsenet pullaavat Shortcatin. Kannattaa varmaan pitää kissaa jatkuvasti auki tekstieditorissa. Ubuntussa suosittelemme gedit
-editoria. Se raportoi, jos tiedostoa on muokattu (esim. git pullin toimesta), niin et vahingossa muokkaa vanhaa versiota.
Jokainen ryhmän jäsen pidentää oman työkopionsa Shortcattia keskikohdasta yhdellä |OMANIMI|
-rivillä (korvaa OMANIMI etunimelläsi), pidennyksen jälkeen kukin tekee commit&pushin yhteiseen repositoryyn. Tehkää tämä samanaikaisesti siten, että committeja tulee jokaiselle ainakin kaksi kappaletta. Shortcatin mahan pituudeksi tulee tällöin 1 + [ryhmässä jäseniä kpl] * 2
.
Komennot per ryhmäläinen ovat siis: pull + 2x( [kasvata mahaa]+add+commit+pull+push )
.
Selvittäkää ristiriidat (conflict) venytyksen edetessä. Ristiriitoja tulee, se on tehtävän tarkoitus! Jos kahden commit&pushin per jäsen jälkeen EI tullut ristiriitaa, jatkakaa venytystä. Nopein ryhmäläinen ei välttämättä saa ristiriitoja ratkaistavakseen (vaan aiheuttaa niitä muille). Tässäkin tapauksessa on suositeltavaa jatkaa mahan pidennystä, kunnes jokainen ryhmäläinen on päässyt ratkaisemaan yhden ristiriidan.
Selvitä git blame
-komennolla, kuka on lisännyt minkin rivin shortcat.txt
-tiedostoon.
Uudelleennimetkää tiedosto longcat.txt:ksi, sillä shortcat on nyt looooooooooooong. Katso git status
-komennolla, havaitsiko Git uudelleennimeämisen.
Katso graafisella Git-työkalulla, miltä repositoryn historia näyttää. Laitoksen Ubuntuilla gitk
tai gitg
tai giggle
. Onko longcat.txt-nimeä edeltävä historia tallessa?
Tehkää ryhmässänne seuraava tehtäväjako: yksi ryhmäläinen muokkaa Longcatin päätä, toinen mahaa ja kolmas jalkoja. Esim. ruumiinosia voi leventää/pidentää ja commit-viestissä ilmoitetaan mitä tehtiin. Kannattaa varmaan sopia yksikäsitteiset muokkausrajat, jos ette enää halua ratkoa merge conflicteja.
Seuraavaksi seuratkaa oheisia ohjeita sekä Git Bookin branch-ohjeita.
master
-branchista oman etunimensä mukaan nimetyn branchin.master
-branchiin.master
-branchista tag valmis-ETUNIMI
.gitk
/gitg
/giggle
mitä tuli tehtyä.master
-branchista.javac Longcat.java
)..gitignore
-tiedosto siten, että .class
-tiedostot pysyvät poissa versionhallinnasta.git add -A
.Tutustu seuraaviin. Näillä on jo aiemmissa tehtävissä katsottu repositoryn tilaa, mutta ohjelmilla voi myös tehdä muutoksia. Kokeile muokata tiedostoa ja suorita sitten commit & push valitsemallasi graafisella työkalulla.
GIT GUI: gitk
/ git gui
, giggle (laitoksen Ubuntu), gitx (OS X) / gitg (Ubuntu).
DIFF GUI: meld (Ubuntu), filemerge (OS X).
Siirtäkää ryhmänne repository GitHubiin. Tämä on helppoa, koska Git on ihana!
git remote -v
Ps. itse aloin tajuta kuinka Git toimii vasta alettuani tosissani käyttää GitHubia. Pps. GitHubista saa opiskelijatunnuksia, joihin saa myös privaatteja repositoryja.
Tehtävä komentorivi-ihmisille!
mail
.public_html
-hakemistoon.TODO näitä ei tehdä. Näitä tehdään jos ehditään ja/tai tuntuu, että osaa aikaisemmat jo riittävän hyvin. Näitä ei tarvitse osata harjoitustyössä. Harjoitustyötä ei ole.
git rebase -i
-komentoa: yhdistäkää, pilkokaa ja uudelleenjärjestelkää committeja.git reflog
-komennon avulla.git stash
-komentoa.git format-patch
, git am
, myös git apply