Skip to content

Latest commit

 

History

History
371 lines (250 loc) · 15.7 KB

versionhallinta.md

File metadata and controls

371 lines (250 loc) · 15.7 KB
layout permalink inheader title
page
/versionhallinta
false
Versionhallinta

Tämä ohje on kopio kurssin ohjelmistotekniikka Git-tutoriaalista muutamin lisäyksin

Tutustumme seuraavaksi 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: Git-tehtävät tulee tehdä tietokoneella, jolle on asennettu Git. Monilla macOS- ja Linux-käyttöjärjestelmien tietokoneilla Git on valmiiksi asennettuna. Asian voi tarkistaa suorittamalla oman tietokoneen terminaalissa komennon:

git --version

Jos komento ei tulosta Git-version numeroa, tutustu Git-asennusohjeisiin. Windows-tietokoneilla asennuksessa ja komentojen suorituksessa voi käyttää esimerkiksi Windows Subsystem for Linux -työkalua.

Jos komennon tulostama gitin versio taas on pienempi kuin 2.23.0, seuraavissa tehtävissä käytetty git restore -komento ei toimi. Voit kuitenkin käyttää git reset HEAD- ja git checkout -komentoja, joista saat lisätietoa Tietokone työvälineen -kurssin materiaaleista.

Git-konfiguraatioita

Avaa terminaali omalla koneellasi. Seuraavat tehtävät tehdään siis paikallisesti, ei melkillä!

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 vielä seuraava konfiguraatio:

git config --global push.default matching

Tämä liittyy git push-komennon oletusarvoiseen toiminnallisuuteen. Komennosta lisää myöhemmin.

Repositorio

Tee nyt sopiva hakemisto gitin harjoittelua varten ja mene hakemistoon, eli anna esim. komennot:

  • mkdir ohtu-git-warmup
  • cd ohtu-git-warmup

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:

$ git init
Initialized empty Git repository in /Users/mluukkai/opetus/ohtu24/koodi/viikot/lh1/ohtu-git-warmup/.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 ohtu-git-warmup.

Luo hakemistoon tiedosto nimeltään tiedosto.txt, esim. komennolla touch. Luotuasi tiedoston, suorita komento git status:

$ touch tiedosto.txt
$ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	tiedosto.txt

nothing added to commit but untracked files present (use "git add" to track)
$

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:

$ git add tiedosto.txt
$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   tiedosto.txt

Git kertoo nyt, että tiedosto.txt on niiden muutosten joukossa, jotka voidaan commitoida.

Commitit

Commitoimisella tarkoitetaan tiedostojen ja hakemistojen sekä niihin liittyvien muutosten tallentamista git-repositorioon.

Suoritetaan commitointi antamalla komento git commit -m "tiedosto.txt luotu"

$ git commit -m "tiedosto.txt luotu"
[main (root-commit) 0e12cfa] tiedosto.txt luotu
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 tiedosto.txt

Suorita jälleen komento git status

$ git status
On branch main
nothing to commit, working tree clean

Git ilmoittaa, että working tree clean, eli hakemistosi on samassa tilassa kuin git-repositorio.

Working directory, index ja staging

Kun teet muutoksia hakemistosi alla oleviin tiedostoihin (tai hakemistoihin), kohdistuvat muutokset working directoryyn eli työhakemistoon.

  • Tee jokin muutos tiedostoon tiedosto.txt
  • Luo hakemistoon uusi tiedosto, nimeltään toinen.txt

Suorita jälleen git status

$ git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   tiedosto.txt

Untracked files:
  (use "git add <file>..." 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 komennolla git status

$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." 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. Jos et määritellyt alun ohjeen mukaan gitille editoriksi nanoa, avautuu oletusarvoinen editori vim ja joudut kenties googlaamaan, miten pääset pois editorista.

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

Git log

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ää:

$ git log
commit cb3a2401ba8bd50a891c883a6666c9cd76459115 (HEAD -> main)
Author: Matti Luukkainen <[email protected]>
Date:   Mon Oct 14 11:54:22 2024 +0300

    muutos ja lisäys

commit a6acd9eb3f83d34255ff66cc55ff757036f65ea2
Author: Matti Luukkainen <[email protected]>
Date:   Mon Oct 14 11:51:55 2024 +0300

    tiedosto.txt luotu
$

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.

Harjoittelua

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ää

gitk

Gitin committeja voi tarkastella myös graafisella gitk-komennolla.

  • gitk-komento toimii Windowsilla ainakin GitHub for Windowsin Git Shellissä.
  • Saat asennettua Maciin gitk:n tämän ohjeen avulla
    • Jos gitk ei jostain syystä toimi, voit asentaa Sourcetree-työkalun

Suorita komento repositoriossa:

![]({{ "/images/gitk1.png" | absolute_url }})

Vasemmalla yläkulmassa näet kaikki commitit. Nykyhetken tilanne on ylimpänä. 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ää tehdessä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
  • Jos käytät sourcetreetä, sen pitäisi päivittyä automaattisesti ja näyttää muutos diff-muodossa

Tiedoston poistaminen ja uudelleennimentä

  • 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

git add -p

  • 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 muutokset
  • 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

Muutosten peruminen

Joskus tiedostoihin tulee tehtyä muutoksia, jotka on tarpeen perua

  • Tee nyt joku muutos tiedostoon eka.txt, älä lisää tiedostoa committoitavaksi
  • Suorita komento git status
$ git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <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 restore eka.txt
  • Kun suoritat uudelleen komennon git status huomaat, että working directory ei enää sisällä muutoksia:
$ git restore eka.txt
$ git status
On branch main
nothing to commit, working trean 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
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

	modified:   kolmas.txt

Ohje muutoksen perumiseen löytyy git statuksen tulosteesta.

  • Suorita muutokset peruva komento git restore --staged kolmas.txt
  • Katsotaan jälleen git status
$ git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <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 restore 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 restore --staged. Tällöin muutokset kuitenkin vielä jäävät tiedostoon, eli ovat working directoryssä. Tiedosto saadaan palautettua repositoriossa olevaan edellisen commitin tilaan komennolla git restore.

![]({{ "/images/gitrestore.png" | absolute_url }})

Harjoittelua

  • luo repositoriosi sisälle hakemisto tiedostoja ja hakemiston sisälle tiedostot file1, file2 ja file3
  • commitoi muutokset
    • muista miten pystyt lisäämään kokonaisen hakemiston sisällön commitoitavaksi 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