Ülesanne 1.1
Repositooriumi loomine
git init -b main


Repo-tasemel Giti kasutaja seadistamine
sed -n '1,200p' .git/config
git config user.name "maksimts-kool"
git config user.email "maksimtsitkool@gmail.com"
sed -n '1,240p' .git/config
git config --local --list

.git algseisu kontroll
test -f .git/index; printf 'index_exit_code=%s\n' "$?"
find .git/objects -type f -print
cat .git/HEAD
git status --short --branch
index_exit_code=1 tähendab, et .git/index faili ei olnud veel olemas. find .git/objects -type f -print ei väljastanud midagi, seega objektifaile ei olnud.

Esimene commit
git add index.html pildid
ls -l .git/index
find .git/objects -type f -print | sort
git status --short --branch
git commit -m "Lisa blogi failid"
git rev-parse HEAD
Esimese commiti hash: cf6a6b1e277cd6cd8a52779a4d49b1b0ad50ea15

Teine commit
Failis index.html parandati kirjaviga:
- <h2>Elehant</h2>
+ <h2>Elevant</h2>
Kasutatud käsud:
git diff -- index.html
git add index.html
git commit -m "Paranda elevandi kirjaviga"
git rev-parse HEAD
Teise commiti hash: dd35c45df236a2a30a624be544d65436b6287b34

Kolmas commit
Faili index.html lisati uus loom:
<h2>Känguru</h2>
<p><b>eluase:</b> Austraalia</p>
<p><b>Kaal:</b> 18-90kg</p>
<p><b>Pikkus:</b> 1-2m</p>
Kasutatud käsud:
git diff -- index.html
git add index.html
git commit -m "Lisa känguru blogisse"
git rev-parse HEAD
git log --oneline --decorate --max-count=5
git status --short --branch
Kolmanda commiti hash: 0f601bfe19352f6d996b80c330effef2dee9613e

Kõik commit’id

Ülesanne 1.2
Repositooriumi loomine
git init -b main

Globaalse kasutaja ja e-posti määramine
git config --global user.name "maksimts-kool"
git config --global user.email "maksimtsitkool@gmail.com"
git config --global --list --show-origin
sed -n '1,200p' .git/config

.git/ sisu uurimine
find .git -maxdepth 2 -type f | sort
cat .git/HEAD
sed -n '1,40p' .git/refs/heads/main
HEAD osutas refs/heads/main peale.git/refs/heads/main ei olnud veel olemas, sest ühtegi commitit polnud tehtud.

Failide lisamine Giti
git add docs pyfiles
git status --short --branch
Git näitas lisatud failid

Esimene commit ja objektide uurimine
git commit -m "Lisa matemaatika library failid"
git rev-parse HEAD
git cat-file -p HEAD
git cat-file -p 05bcca1d801b2026250e6f88fd1befb16df3a994
cat .git/HEAD
cat .git/refs/heads/main
Esimese commiti hash: bce4f446b59bb0d0ed6cf493a74b6a01cd83bf96
Repo juure ehk tree objekti hash: 05bcca1d801b2026250e6f88fd1befb16df3a994
Nüüd on fail .git/refs/heads/main olemas ja sisaldab esimese commiti hash’i.

Uurimine:

test.py käivitamine
/opt/homebrew/bin/python3.11 pyfiles/test.py # macos python
git status --short --untracked-files=all
Test väljastas nurkade väärtused ning tekkisid uued cache failid:
pyfiles/__pycache__/factorial.cpython-311.pyc
pyfiles/__pycache__/trigonometry.cpython-311.pyc

Teine commit ja parent commiti leidmine
git add pyfiles/__pycache__
git commit -m "Lisa testi käivitamisel tekkinud cache failid"
git rev-parse HEAD
git cat-file -p HEAD
cat .git/HEAD
cat .git/refs/heads/main
git log --oneline --decorate --all
Teise commiti hash: 513193ef537bd05e400512856ae5e62eb7bc51eb
Parent hash: 39a1976f39ce5943a323cf483873a29721b676d7
Pärast teist commitit viitab HEAD endiselt harule refs/heads/main.

Uurimine:

Ülesanne 2
Uue branch’i loomine
git switch -c new-features
git status --short --branch

Tulemus: loodi uus branch `new-features` ja töö jätkus sellel branch’il.
rectangle.py faili lisamine
Lisati fail rectangle.py:
def area(a, b):
return a * b
def perimeter(a, b):
return a + b
Seejärel kontrolliti muutusi ja tehti commit:
git status --short
git add rectangle.py
git commit -m "L-03: Added rectangle.py"
git rev-parse HEAD

Tulemus: esimene commit branch’il new-features lisas ristküliku pindala ja ümbermõõdu funktsioonid. Ümbermõõdu valem oli selles commitis veel vigane.
triangle.py faili lisamine ja rectangle.py parandamine
Lisati fail triangle.py:
def area(a, h):
return a * h / 2
def perimeter(a, b, c):
return a + b + c
Failis rectangle.py parandati ümbermõõdu valem:
def area(a, b):
return a * b
def perimeter(a, b):
return 2 * (a + b)
Kasutatud käsud:
git diff
git add triangle.py rectangle.py
git commit -m "L-03: Added triangle.py and fixed rectangle perimeter bug"
git rev-parse HEAD

Tulemus: teine commit lisas kolmnurga valemid ja parandas ristküliku ümbermõõdu valemi.
Kogu repo ajaloo vaatamine
git log --all --graph --oneline --decorate

Tulemus: väljastati kogu repositooriumi graafiline ajalugu koos kõigi branch’idega. Väljundis oli näha ka `new-features` branch koos kolme uue commitiga.
Praeguse branch’i graafilise ajaloo vaatamine
git log --graph --oneline --decorate

Tulemus: väljastati ainult praeguse branch’i ehk `new-features` ajalugu. Seal pidi olema näha kolm uut commitit
Kahe viimase commiti võrdlemine
Kahe viimase commiti hashid võeti git log väljundist ning võrreldi neid käsuga:
git diff <esimese-commiti-hash> <teise-commiti-hash>
Esimene: 4ce320b707eb23627085f26ff537e038b6c93eb2
Teine: 7f4cd4694c4262e7d9773067a6892e33b92284e4

new-features branch’i kustutamine ilma ühendamiseta
Kuna aktiivset branch’i ei saa kustutada, tuli enne liikuda tagasi `main` branch’ile
git switch main
git branch -D new-features
git branch

Tulemus: branch `new-features` kustutati ilma `main` branch’iga ühendamata.
Ülesanne 3
Kausta ja branch’ide uurimine
git branch --all
git checkout develop
git status --short --branch
git checkout feature
git status --short --branch
git checkout main
git branch --all

Tulemus: kontrolliti, et projektis on olemas branch’id main, develop ja feature. Branch’ide vahetamisel muutus töökausta sisu vastavalt valitud branch’ile.
Branch’ide sisu kontrollimine
Branch main sisaldas põhifaile:
git checkout main
find . -maxdepth 2 -type f | sort
Branch develop sisaldas lisaks faili calculate.py:
git checkout develop
find . -maxdepth 2 -type f | sort
Branch feature sisaldas lisaks faili rectangle.py:
git checkout feature
find . -maxdepth 2 -type f | sort

Tulemus: branch’id näitasid erinevat projekti seisu. main oli stabiilne alus, develop sisaldas arvutusfaili ning feature sisaldas ristküliku faili.
Graafilise ajaloo vaatamine
git log --all --graph --oneline --decorate

Tulemus: väljastati kogu repositooriumi graafiline commit’i ajalugu. Selle järgi oli näha, kuidas main, develop ja feature branch’id ühisest ajaloost hargnevad.
Vigase commiti tagasivõtmine feature branch’is
Viimane commit feature branch’is oli vigane. Selle muutused võeti tagasi käsuga git revert
git checkout feature
git log --oneline --decorate
git revert HEAD
git log --oneline --decorate

Tulemus: feature branch’i lõppu tekkis uus revert commit, mis tühistas ebaõnnestunud viimase commiti muudatused.
Kahe seotud commiti ühendamine develop branch’is
develop branch’is olid kaks sama teemaga commitit:
L-03: Add calculate.py
L-03: Update docs for calculate.py
Need ühendati üheks commitiks käsuga git reset --soft HEAD~2. Soft reset liigutab branch’i osuti kaks commitit tagasi, kuid jätab mõlema commiti failimuudatused staged olekusse.
git checkout develop
git log --oneline --decorate
git reset --soft HEAD~2
git status --short
git commit -m "L-03: Add calculate.py and update docs"
git log --oneline --decorate

Tulemus: kahe eraldi commiti asemel jäi develop branch’i üks koondcommit, mis lisas calculate.py faili ja uuendas dokumentatsiooni.
experiment branch’i loomine
Eksperimentide jaoks loodi uus branch main branch’i põhjal.
git checkout main
git checkout -b experiment
git status --short --branch

Dokumentatsiooni kopeerimine develop branch’ist
experiment branch’is oli docs/README.md vananenud. Sinna võeti dokumentatsiooni uus versioon develop branch’i viimasest commitist.
git restore --source develop --worktree docs/README.md
git status --short

Tulemus: docs/README.md muudeti samasuguseks nagu develop branch’is.
calculate.py faili lisamine develop branch’ist
Seejärel lisati experiment branch’i fail calculate.py, mis oli olemas develop branch’is.
git restore --source develop --worktree calculate.py
git status --short
git add docs/README.md calculate.py
git commit -m "L-03: Experimental commit"

Tulemus: experiment branch’i lisati uuendatud dokumentatsioon ja töötav calculate.py fail.
circle.py ja square.py kustutamine
Eksperimendi käigus selgus, et failid circle.py ja square.py segavad projekti testimist. Need eemaldati ja muudatus salvestati uue commitina.
git rm circle.py square.py
git status --short
git commit -m "L-03: Deleted circle and square"
git log --oneline --decorate

Tulemus: experiment branch’ist eemaldati circle.py ja square.py. Alles jäid katsetamiseks vajalikud failid calculate.py, docs/README.md ning teised selles branch’is vajalikud failid.
Lõplik kontroll
git log --all --graph --oneline --decorate
git branch --all
git status --short --branch

Tulemus: graafilisest ajaloost oli näha main, parandatud feature, koondatud commitiga develop ja katsetuste jaoks loodud experiment branch.
Ülesanne 4
Kausta ja branch’ide uurimine
git branch --all
git checkout develop
git status --short --branch
git checkout feature
git status --short --branch
git checkout release
git status --short --branch
git checkout main
git branch --all

Tulemus: kontrolliti, et projektis on olemas branch’id main, develop, feature ja release.
Branch’ide failistruktuuri kontrollimine
Branch main:
git checkout main
find . -maxdepth 2 -type f | sort
Branch develop:
git checkout develop
find . -maxdepth 2 -type f | sort
Branch feature:
git checkout feature
find . -maxdepth 2 -type f | sort
Branch release:
git checkout release
find . -maxdepth 2 -type f | sort

Tulemus: main sisaldas stabiilseid põhifaile, develop lisas calculate.py, feature lisas rectangle.py ja release lisas user_agreement.txt.
Graafilise ajaloo vaatamine
git log --all --graph --oneline --decorate

Tulemus: väljastati kogu repositooriumi commit’i ajalugu graafilisel kujul. Selle järgi oli näha, millisest kohast develop, feature ja release branch’id main branch’ist hargnesid.
develop branch’i merge main branch’i merge-commitiga
Kõigepealt ühendati develop branch main branch’i kasutades --no-ff atribuuti. See loob eraldi merge commiti ka siis, kui fast-forward merge oleks võimalik.
git checkout main
git merge --no-ff develop -m "L-03: Merge develop into main"
git log --graph --oneline --decorate

Tulemus: main branch’i tekkis uus merge commit, millel oli kaks parent commitit.
Loodud merge commiti kustutamine
Harjutuse jaoks kustutati just loodud merge commit, et sama ühendamine uuesti fast-forward režiimis teha.
git reset --hard HEAD~1
git log --graph --oneline --decorate

Tulemus: main branch viidi tagasi merge’ile eelnenud seisu. develop branch jäi alles ja selle commitid ei kadunud.
develop branch’i fast-forward merge main branch’i
Seejärel ühendati sama develop branch main branch’i fast-forward režiimis.
git checkout main
git merge --ff-only develop
git log --graph --oneline --decorate

Tulemus: eraldi merge commitit ei tekkinud. main branch’i osuti liikus otse develop branch’i viimase commiti peale.
release branch’i commit’ide ühendamine interaktiivse rebase abil
release branch’is ühendati mitu commitit üheks commitiks ning muudeti commiti sõnum.
git checkout release
git rebase -i main
Kirjuta:
pick <commit-1> L-03: Add user agreement
squash <commit-2> L-03: Update release docs
Tulemus: release branch’i mitu commitit muudeti üheks selge sõnumiga commitiks.
Konfliktide lahendamine rebase ajal
Kui rebase ajal tekkis konflikt, näitas Git konfliktis failid käsuga:
git status --short
Konflikt lahendati failis käsitsi, eemaldades konfliktimärgid:
<<<<<<< HEAD
main branch'i versioon
=======
release branch'i versioon
>>>>>>> <commit>
Pärast lahendamist jätkati rebase’i:
git add docs/README.md
git rebase --continue
Tulemus: rebase lõpetati edukalt ning release branch jäi main branch’i peale ühe koondcommitina.
release branch’i fast-forward merge main branch’i
Pärast edukat rebase’i ühendati release branch main branch’i fast-forward merge’iga.
git checkout main
git merge --ff-only release
git log --all --graph --oneline --decorate

Tulemus: main branch’i osuti liikus release branch’i koondcommiti peale. Eraldi merge commitit ei tekkinud.
Lõplik kontroll
git branch --all
git status --short --branch
git log --all --graph --oneline --decorate

Tulemus: graafilisest ajaloost oli näha, et develop ühendati main branch’i fast-forward režiimis ja release branch’i commit’id ühendati üheks commitiks enne main branch’i ühendamist.
Ülesanne 5
Originaalrepositooriumi avamine ja fork’i loomine
Avati originaalrepositoorium:
https://github.com/smartiqaorg/geometric_lib
GitHubi lehel vajutati nuppu Fork ning loodi repositooriumi koopia enda kasutaja alla.

Fork’itud repositooriumi kloonimine
Enda fork klooniti arvutisse. Käsus tuleb <github-username> asendada enda GitHubi kasutajanimega.
git clone https://github.com/<github-username>/geometric_lib.git geometric_lib-github
cd geometric_lib-github
git remote -v

Tulemus: arvutisse tekkis kaust geometric_lib-github, mille origin remote osutas enda fork’ile.
Lokaalse Git kasutaja seadistamine
Repositooriumi sees seadistati lokaalne kasutajanimi ja e-post:
git config user.name "Maksim Tsikvasvili"
git config user.email "maksimtsitkool@gmail.com"
git config --local --list

Tulemus: kasutaja andmed salvestati selle repositooriumi .git/config faili.
docs/README.md faili muutmine ja commit
Kõigepealt loodi eraldi branch muudatuse jaoks:
git checkout -b docs-update
Seejärel muudeti faili docs/README.md. Näiteks lisati dokumentatsiooni lõppu märkus:
Documentation updated in fork for pull request practice.
Muudatus kontrolliti ja salvestati commitina:
git diff docs/README.md
git status --short
git add docs/README.md
git commit -m "L-03: Update docs in fork"
git log --oneline --decorate --max-count=3

Tulemus: docs/README.md muudatus salvestati uude commitisse.
Muudatuse push enda GitHubi fork’i
Muudetud branch saadeti enda GitHubi repositooriumisse:
git push -u origin docs-update

Tulemus: GitHubis tekkis branch docs-update koos tehtud commitiga.
GitHubis tulemuse kontrollimine
Avati enda fork:
https://github.com/maksimts-kool/geometric_lib
Kontrolliti:
- branch
docs-updateon olemas; - fail
docs/README.mdsisaldab tehtud muudatust; - commit history näitab commitit
L-03: Update docs in fork.

Pull request’i loomine
GitHubis vajutati nuppu Compare & pull request.
Pull request’i pealkiri:
L-03: Update docs in fork
Pull request’i kirjeldus:
Updated docs/README.md as part of GitHub fork and pull request practice.
Changes:
pushed the branch to my fork.
added a short documentation note;
committed the change in a separate branch;

Lõplik kontroll
Pärast pull request’i loomist kontrolliti uuesti:
git status --short --branch
git remote -v
git log --oneline --decorate --max-count=5

Tulemus: lokaalne töökaust oli korras, commit oli olemas ning GitHubis oli pull request avatud.
Tagasiside
Harjutuses oli paar segast kohta. Näiteks enne esimest commit’i ei olnud .git/refs/heads/main faili veel olemas ja see võis tunduda veana. Samuti tekitas segadust __pycache__ failide tekkimine pärast Python’i testi käivitamist.
Keeruline oli aru saada, kuidas HEAD, branch ja commit omavahel seotud on.
Harjutuses võiks selgemalt kirjutada, mis tulemused on normaalsed ja mida peab kontrollima. Samuti võiks mainida, et __pycache__ faile tavaliselt Git’i ei lisata.