-
Notifications
You must be signed in to change notification settings - Fork 1
Viikon 3 paikanpaalla tehtavat
Komentoriviä käyttäessä kannattaa ehdottomasti totutella tab-completen käyttöön. Tab on näppäin, joka näyttää suunilleen seuraavalta
Tab:ia painamalla voit komentorivillä täydentää kirjoittamasi komennon nimen tai parametrin. Esim. jos olet siirtymässä hakemistoon nimeltään ohjelmistotekniikanmenetelmatsyksy2016, riittää, että kirjoitat cd oh
ja painat tabia. Jos hakemistossasi ei ole muita tiedostoja tai hakemistoja, jotka alkavat merkeillä oh, nimi täydentyy. Jos on, niin voit joutua kirjoittamaan merkin tai kaksi lisää.
Myös komentojen nimet voi täydentää tab-completella. Esim. haluat avat chromium-browser web-selaimen komentoriviltä, riittää että kirjoitat chro
ja painat tabia. Komennon nimi täydentyy.
Ei pidä myöskään unohtaa nuolta ylöspäin. Sen avulla voit selata aiemmin kirjoittamiasi komentoja.
Suurin osa näytti pitävän edellisellä viikolla vain yhtä terminaali-ikkunaa kerrallaan auki. Useissa tilanteissa työtehosi moninkertaistuu, jos avaat useita terminaaleja näytöllä tai avaat yhteen terminaaliin useita "tabeja" eli välilehtiä. Uuden tabin saat avautumaan painamalla yhtä aikaa ctrl, shift ja t tai sovelluksen valikosta (joka laitoksen Linuxeissa sijaitsee ruudun yläreunassa).
Tutustumme tänään versionhallintaan.
Mitä tarkoitetaan versionhallinnalla? Lainaus sivulta https://www.atlassian.com/git/tutorials
Version control systems are a category of software tools that help a software team manage changes to source code over time. Version control software keeps track of every modification to the code in a special kind of database. If a mistake is made, developers can turn back the clock and compare earlier versions of the code to help fix the mistake while minimizing disruption to all team members.
Vaikka ylläoleva puhuu versionhallinnasta ohjelmistotiimien yhteydessä, kannattaa versionhallintaa käyttää oikeastaan yhdenkin hengen projekteissa ja muunkinlaisen materiaalin, kuin koodin hallinnoimiseen. Esim. tämän kurssin kaikki materiaali on talletettu versionhallintaan.
Nykyään suosituin versionhallintaohjelmisto on git. Tutustumme tänään gitin alkeisiin.
HUOM tämä tehtävä tulee tehdä Linuxilla tai Macilla, jolle on asennettu Git. Helpointa lienee tehdä tehtävä laitoksen koneella. Git kannattaa joka tapauksessa asentaa omalle koneelle. Gitin voi asentaa myös Windowsille.
Avaa terminaali.
Määrittele gitille oma nimesi sekä käyttämäsi email-osoite antamalla komennot:
git config --global user.name "Your Name"
git config --global user.email [email protected]
Varmista, komennolla git config -l
, että määrittelyt menivät oikein.
Määritellään vielä git käyttämään sopivia värejä komennolla git config --global color.ui
ja vaihdetaan gitin käyttämäksi oletuseditoriksi nano komennolla git config --global core.editor nano
- jos käytät vimiä, voit jättää oletuseditorin muuttamatta
Tee nyt sopiva hakemisto gitin harjoittelua varten ja mene hakemistoon, eli anna esim. komennot:
- mkdir otm_viikko3
- cd otm_viikko3
HUOM: varmista nyt että olet luomassasi hakemistossa, eli jos suoritat komennon ls, ei hakemistossa pitäisi olla mitään.
Luodaan hakemistosta paikallinen git-repositorio antamalla komento git init
Git ilmoittaa alustaneensa repositorion:
mluukkai@melkinpaasi:~/otm_viikko3$ git init Initialised empty Git repository in /home/ad/fshome4/u4/m/mluukkai/Linux/otm_viikko3/.git/
Jos katsot hakemiston sisältöä komennolla ls -la
huomaat, että hakemiston sisälle on ilmestynyt hakemisto .git
. Git käyttää luotua hakemistoa pitääkseen kirjaa repositorioon talletetuista tiedostoista.
HUOM koska hakemiston nimi (.git) alkaa pisteellä, ei komento ls näytä sitä oletusarvoisesti. Parametri a näyttää myös pisteellä alkavat tiedostot ja hakemistot. Kokeile, miten ls -a ja ls -la eroavat toisistaan!
Pysy edelleen repositorion sisältävässä hakemistossasi _ otm_viikko3_.
Luo hakemistoon tiedosto nimeltään tiedosto.txt, esim. komennolla touch
. Luotuasi tiedoston, suorita komento git status
:
mluukkai@melkinpaasi:~/otm_viikko3$ touch tiedosto.txt mluukkai@melkinpaasi:~/otm_viikko3$ git status On branch master Initial commit Untracked files: (use "git add ..." to include in what will be committed) tiedosto.txt nothing added to commit but untracked files present (use "git add" to track) mluukkai@melkinpaasi:~/otm_viikko3$
Git ilmoittaa, että on olemassa tiedosto, joka on tilassa untracked, eli tiedostoa ei ole lisätty versionhallinnan pariin.
Kuten komennon tuloste kertoo, tiedoston lisääminen gitin alaisuuteen (...to include in what will be committed) tapahtuu komennolla git add tiedosto.txt
Suorita lisäys ja sen jälkeen komento git status
:
mluukkai@melkinpaasi:~/otm_viikko3$ git add tiedosto.txt mluukkai@melkinpaasi:~/otm_viikko3$ git status On branch master Initial commit Changes to be committed: (use "git rm --cached ..." to unstage) new file: tiedosto.txt
Git kertoo nyt, että tiedosto.txt on niiden muutosten joukossa, jotka voidaan commitoida.
Commitoimisella tarkoitetaan tiedostojen ja hakemistojen sekä niihin liittyvien muutosten tallentamista git-repositorioon.
Suoritetaan commitointi antamalla komento git commit -m"tiedosto.txt luotu"
mluukkai@melkinpaasi:~/otm_viikko3$ git commit -m"tiedosto.txt luotu" [master (root-commit) 0e12cfa] tiedosto.txt luotu 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tiedosto.txt
Suorita jälleen komento git status
mluukkai@melkinpaasi:~/otm_viikko3$ git status On branch master nothing to commit, working directory clean
Git ilmoittaa, että working directory clean, eli hakemistosi on samassa tilassa kuin git-repositorio.
Muista käyttää tab-completea tehtäviä tehdessäsi!
Kun teet muutoksia hakemistosi alla oleviin tiedostoihin (tai hakemistoihin), kohdistuvat muutokset working directoryyn eli työhakemistoon.
- Tee jokin muutos tiedostoon tiedosto.txt
- käytä tiedostojen editointiin nano-editoria. Editori käynnistyy komentoriviltä komennolla nano tiedosto.txt
- saat tallennettua nanossa tiedoston painamalla yhtä aikaa ctrl ja o
- editori sulkeutuu painamalla ctrl ja x
- Luo hakemistoon uusi tiedosto, nimeltään toinen.txt
Suorita jälleen git status
mluukkai@melkinpaasi:~/otm_viikko3$ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: tiedosto.txt Untracked files: (use "git add ..." to include in what will be committed) toinen.txt no changes added to commit (use "git add" and/or "git commit -a")
Git ilmoittaa nyt, että uusi tiedosto on untracked ja että aiemmassa tiedostossa on muutoksia, jotka eivät ole staged for commit.
Toimitaan ohjeen mukaan eli lisätään muutokset ja uusi tiedosto commitoitavien joukkoon. Molempien tiedostojen yhtäaikainen "addaaminen" onnistuu komennolla git add .
Tarkistetaan taas tilanne koennolla git status
mluukkai@melkinpaasi:~/otm_viikko3$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: tiedosto.txt
new file: toinen.txt
Sekä muutos että uusi tiedosto ovat nyt valmiina committoitavaksi.
Committointi onnistuu komennolla git commit. Kuten edelliselläkin kerralla, annetaan komennolle parametrina commit-viesti, eli merkkijono, joka kuvaa mitä muutoksia uusi commit tuo edelliseen nähden:
git commit -m"muutos ja lisäys"
Tarkasta committoinnin jälkeen jälleen tilanne komennolla git status.
HUOM jos suoritat commitoinnin vahingossa ilman commit-viestiä, eli parametria -m, avaa git tekstieditorin ja olettaa että haluat kirjoittaa commit-viestin editoriin.
Tiedostot ja niihin tehdyt muutokset voivat siis olla gitin suhteen kolmessa eri tilassa.
- Aluksi tiedostot (tai niihin tehdyt muutokset) ovat vain working directoryssä ja git ei noteeraa niitä ennen kun ne lisätään komennolla
git add
. - Tämän jälkeen tiedostot ovat valmiina commitoitavaksi. Gitin terminologian mukaan valmiina committoitavaksi olevat tiedostot ovat staging-alueella.
- Komento
git commit
siirtää stagingissa olevat muutokset repositorioon eli luo uuden commitin.
Seuraava kuva havainnollistaa sitä, miten tiedoston tila vaihtuu git-komentoja tekemällä.
Kun tiedosto luodaan, menee se gitin working directoryyn. Komennolla git add tiedosto siirtyy staging, alueelle, eli valmiiksi committointia varten. Stagingissa oleva tiedosto viedään (eli "commitoidaan") repositorioon komennolla git commit. Kun committoitua tiedostoa taas editoidaan, menevät muutokset jälleen working directoryyn.
Jokainen komennon git commit suorittaminen siis synnyttää repositorioon uuden commitin, eli uuden "tilan". Komennolla git log
on mahdollista nähdä, mitä committeja repositorio sisältää:
mluukkai@melkinpaasi:~/otm_viikko3$ git log commit 50c786fdc41104cdfe3e60845df40820feb33d40 Author: Matti Luukkainen Date: Mon Nov 7 18:18:19 2016 +0200 lisäys ja muutos commit 0e12cfa5de9186eb948ac446c6b3f240ff11189d Author: Luukkainen Matti Date: Mon Nov 7 16:11:33 2016 +0200 tiedosto.txt luotu mluukkai@melkinpaasi:~/otm_viikko3$
Gitin logi kertoo jokaisen commitin ajan, tekijän, viestin ja tunnisteen. Tunnisteita käytetään, jos on esim. tarvetta palata johonkin vanhan commitin tilaan.
Voit selata logia nuolinäppäimillä. Pääset ulos git log:ista painamalla q.
Muista käyttää komentoa git status mahdollisimman usein!
-
älä myöskään unohda tab-completea
-
Luo tiedosto kolmas.txt.
-
Lisää se commitoitavaksi ja commitoi.
-
Muuta tiedostojen toinen.txt ja kolmas.txt sisältöä ja commitoi muutokset
-
Luo hakemisto stuff ja sen sisälle jokin tiedosto.
-
Lisää muutokset committoitavaksi ja committoi.
- Huomaa, että hakemiston lisääminen riittää, sen sisältämät tiedostot tulevat automaattisesti lisätyksi.
-
Katso miltä git logi näyttää
Giting committeja voi tarkastella myös graafisella gitk-komennolla (OSx:lle vastaava työkalu on gitx). Suorita komento repositoriossa:
Vasemmalla yläkulmassa näet kaikki commitit. Uusin tilanne ylimpänä. Uusimman commitin nimi on master. Klikkaamalla commitia, näet muissa ikkunoissa commitiin liittyviä tietoja. Oikealla alakulmassa näet ne tiedostot, jotka ovat muuttuneet commitissa (jos valinta on patch) tai ne tiedostot, joita repositoriossa oli olemassa commitin aikana (jos valinta on tree). Vasemmassa alakulmassa pystyt tarkastelemaan commitin tiedostoihin tekemiä muutoksia tai tiedostojen tilaa commitin aikana. Valinnat ovat hieman hämäävät sillä ne toimivat eri tavoin riippuen oikean puolen moodista.
Seuraavaa tehtävää tekiessäsi kannattaa terminaaliin avata uusi välilehti jotta voit pitää gitk:ta käynnissä.
- Kopioi tiedostoon tiedosto.txt jostain paljon tekstiä ja commitoi tiedosto.
- Poista nyt osa tiedoston tekstistä ja lisää tiedostoon hieman lisää tekstiä.
- commitoi muutosten jälkeen
- Päivitä gitk:n näkymä (file/update) ja katso miten muutokset näkyvät (tarkastele kahta ylintä committia)
- valitse oikeasta alakulmasta patch ja vasemmasta diff.
- näin näet commitin aiheuttamat muutokset diff-muodossa
- jos oikealta on valittuna tree näkyy vasemmalla puolella (valinnasta riippumatta) tiedostojen commitin aikainen tilanne
- Poista tiedosto toinen.txt
- suorita git status
- commitoi muutos
- poista ensin tiedosto gitin alaisuudesta komennolla git rm
- varmista komennolla git status että kaikki on niinkuin kuuluukin
- muuta tiedoston tiedosto.txt nimeksi eka.txt
- uudelleennimentä tapahtuu komennolla mv
- suorita git status
- miten git käsittelee uudelleennimennän?
- commitoi muutos
- Tee jotain muutoksia tiedostoihin eka.txt ja kolmas.txt
- tee sekä lisäyksiä että poistoja
- lisää ne commitoitavaksi komennolla git add -p
- git näyttää nyt jokaisen tekemäsi muutoksen patch-muodossa ja pyytää varmistamaan lisätäänkö muutos commitoivaksi
- hyväksy painamalla y ja enter
- commitoi muutoset
- tee tiedostoihin tehtyjen muutosten commitoitavaksi lisääminen aina komennolla git add -p, näin pääset tarkastamaan, että muutokset ovat juuri ne mitä oletat olevasi lisäämässä
- Huomaa, että kokonaan uudet tiedostot eivät siirry committoitavaksi komennolla git add -p
Joskus tiedostoihin tulee tehtyä muutoksia, jotka on tarpeen perua
- tee nyt joku muutos tiedostoon eka.txt, älä lisää tiedostoa committoitavaksi
- suorita komento git status
mluukkai@melkinpaasi:~/otm_viikko3$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: eka.txt
no changes added to commit (use "git add" and/or "git commit -a")
Kuten oletettua, git kertoo että olemme tehneet muutoksia jotka eivät ole "staged for commit", eli lisättyjä commitoitavaksi.
- Päätetäänkin perua muutokset. Se onnistuu komennolla
git checkout -- eka.txt
- Kun suoritat uudelleen komennon git status huomaat, että working directory ei enää sisällä muutoksia:
mluukkai@melkinpaasi:~/otm_viikko3$ git checkout -- eka.txt
mluukkai@melkinpaasi:~/otm_viikko3$ git status
On branch master
nothing to commit, working directory clean
- Varmista vielä, että tiedoston sisältö on sama kuin ennen muutoksia
Myös stagingiin viety eli valmiina committoitavaksi oleva muutos voidaan perua.
- Tee muutoksia tiedostoon kolmas.txt ja lisää se committoitavaksi. Älä kuitenkaan committoi.
- git statuksen pitäisi näyttää seuraavalta
mluukkai@melkinpaasi:~/otm_viikko3$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: kolmas.txt
mluukkai@melkinpaasi:~/otm_viikko3$
Ohje muutoksen perumiseen löytyy git statuksen tulosteesta.
- suorita muutokset peruva komento
git reset HEAD kolmas.txt
- katsotaan jälleen git status
mluukkai@melkinpaasi:~/otm_viikko3$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: kolmas.txt
no changes added to commit (use "git add" and/or "git commit -a")
Tiedosto ei siis enää ole staged-tilassa, muutokset ovat kuitenkin working directoryssä, eli jos katsot tiedoston sisällön, muutokset ovat vielä olemassa
- pääset perumaan muutokset kokonaan antamalla komennon
git checkout -- kolmas.txt
- varmista, että tiedosto on palannut muutoksia edeltävään tilaan
Seuraavassa tiedoston tilaa kuvaava kaavio täydennettynä, eli jos tiedosto on lisätty committoitavaksi, eli se on staged, voidaan muutos perua komennolla git reset HEAD. Tällöin muutokset kuitenkin vielä jäävät tiedostoon, eli ovat _working directoryssä. Tiedosto saadaan palautettua repositoriossa olevaan edellisen commitin tilaan komennolla git checkout.
- luo hakemisto tiedostoja ja hakemiston sisälle tiedostot file1, file2 ja file3
- commitoi muutokset
- muista miten pystyt lisäämään kokonaisen hakemiston sisällön committoitavaksi yhdellä komennolla
- muuta tiedoston file1 sisältöä ja poista tiedosto file2
- peru muutokset!
- muuta tiedoston file3 sisältöä, lisää commitoitavaksi
- peru muutokset!
- poista tiedosto file1 ja uudelleennimeä tiedosto file2 tiedostoksi file22
- committoi
On tilanteita, joissa emme halua tiedostojen menevän versionhallinnan alaisuuteen. maven-projektien hakemisto target, joka sisältää maven-komentojen aikaansaannokset, on tyypillisesti hakemisto, jota emme halua versionhallinnan pariin.
Git-repositorion juureen sijoitettavassa .gitignore-tiedostossa voidaan määritellä, mitä tiedostoja ja hakemistoja git jättää huomioimatta eli ignoroi
- Muuta viime viikon paikanpäällä tehtävässä tekemäsi hakemisto Unicafe git-repositorioksi
- komento git init
- HUOM: älä vielä lisää mitään commitoitavaksi!
- muista tässäkin myös komennon git status aktiivinen käyttö!
- Luodaan repositorion juureen tiedosto .gitignore ja määritellään siihen ignoroitavaksi hakemisto target ja tiedosto nbactions.xml, eli
- luo tiedosto nanolla
- tiedoston sisällöksi tulee
target nbactions.xml
- kun nyt teet komennon git status pitäisi tuloksen olla seuraava:
mluukkai@melkki:~/Unicafe$ git status On branch master Initial commit Untracked files: (use "git add ..." to include in what will be committed) .gitignore pom.xml src/
- eli vaikka hakemistossa on tiedosto nbactions.xml sekä alihakemisto target, ei git niitä huomioi
- lisää hakemiston sisältö repositorioon
- commitoi
- tarkasta tilanne komennolla git status
- kokeile nyt suorittaa maven-komentoja, jotka tekevät muutoksia hakemistoon target
- esim. testien suoritus ja testiraportin generointi
- tarkasta komennolla git status, että git ei välitä muutoksista
- tee jokin muutos projektin koodiin ja tarkasta että git huomaa tilanteen
- commitoi muutoset