Git Labor
Eeldused: VirtualBox, Vagrant, VS Code
Platvorm: Ubuntu VM, Git, GitHub
Kestus: ~3 tundi
Õpiväljundid
Pärast laborit oskate:
- Seadistada Git + GitHub SSH workflow'i algusest peale
- Rakendada branch + Pull Request töövooge (nagu päris meeskonnas)
- Lahendada merge konflikte kahe arendaja stsenaariumi põhjal
- Hallata kohalikku ja remote repositooriumi korraga
1. VS Code Remote-SSH Seadistamine
Masinad on juba olemas Proxmox'is. Seadistame VS Code ühenduse, et saaksime mugavalt töötada.
1.1 SSH Config
Windows: C:\Users\SINUNIMI\.ssh\config
Linux/Mac: ~/.ssh/config
Lisa oma masina andmed:
Host git-vm
HostName 192.168.X.X
User kasutajanimi
IdentityFile ~/.ssh/id_ed25519
StrictHostKeyChecking no
1.2 Ühenda VS Code
VS Code:
Ctrl+Shift+PRemote-SSH: Connect to Host- Vali
git-vm - Platform:
Linux - Open Folder:
/home/kasutajanimi
Kontrolli: vasakul all peaks olema SSH: git-vm
Kontrollnimekiri: - [ ] SSH ühendus töötab - [ ] VS Code näitab remote masina faile
2. Git + GitHub Põhiseadistus
Töömaailmas: Alati seadista local + remote koos. Ei ole mõtet teha tööd, mida keegi teine ei näe.
2.1 Kontrolli Git
Kui puudub:
2.2 Konfigureeri Identiteet
Git vajab teada, kes sa oled. Iga commit salvestab selle info.
git config --global user.name "Sinu Nimi"
git config --global user.email "sinu.email@example.com"
git config --global core.editor "nano"
git config --global init.defaultBranch main
Kontrolli:
2.3 GitHub Konto
Kui sul pole:
- Mine
https://github.com→ Sign up - Kinnita e-post
- Settings → Two-factor authentication (valikuline, aga soovitatav)
Kontrollnimekiri:
- [ ] git --version töötab
- [ ] git config user.name näitab sinu nime
- [ ] GitHub konto olemas ja sisse logitud
3. SSH Võtmed GitHub'iga
Miks SSH, mitte HTTPS? HTTPS küsib paroolid pidevalt. SSH võti = üks kord setup, seejärel automaatne auth. Töömaailmas standard.
3.1 Genereeri SSH Võti VM-is
Vajuta ENTER kõigile küsimustele (no passphrase).
Käivita SSH agent ja lisa võti:
Kopeeri public key (NB! .pub lõpuga):
Kopeeri kogu väljund (algab ssh-ed25519 ...).
3.2 Lisa GitHub'i
- GitHub → Settings (profiili all)
- SSH and GPG keys (vasakult menüüst)
- New SSH key
- Title:
VM controller(või mis tahes kirjeldav nimi) - Key: kleebi public key
- Add SSH key
3.3 Testi Ühendust
Oodatav vastus:
Kui küsib "Are you sure (yes/no)?" → kirjuta yes
Kontrollnimekiri:
- [ ] SSH võti genereeritud
- [ ] Public key GitHub'is
- [ ] ssh -T git@github.com kinnitab autentimist
4. Loo GitHub Repositoorium (Remote Esmalt!)
Workflow pärismaailmas: Tavaliselt lood GitHub repo esmalt, siis clone'id kohalikku. Teeme sama.
4.1 GitHub'is
- GitHub → "+" (üleval paremal) → New repository
- Repository name:
git-labor - Description:
Git labor harjutusprojekt - Public (et saaksid hiljem näidata)
- ÄRA MÄRGI "Add README" (teeme kohalikult)
- Create repository
GitHub näitab nüüd setupi juhiseid. Ignoreeri neid - järgime oma plaani.
4.2 Clone Repositoorium VM-i
Kopeeri SSH URL GitHub'ist (Code → SSH → kopeeri):
VM-is:
Kontrolli remote:
Peaks näitama:
origin git@github.com:KASUTAJANIMI/git-labor.git (fetch)
origin git@github.com:KASUTAJANIMI/git-labor.git (push)
Kontrollnimekiri:
- [ ] GitHub repo loodud
- [ ] Clone'itud SSH kaudu
- [ ] git remote -v näitab origin'i
5. Esimesed Commit'id ja Push
Nüüd on local + remote ühendatud. Iga muudatus läheb kohalikku, siis push'ime GitHub'i.
5.1 Loo README
cat > README.md << 'EOF'
# Git Labor Projekt
**Autor:** Sinu Nimi
**Kuupäev:** 2025-XX-XX
## Eesmärk
Õppida Git workflow'sid, branch'e ja koostööd GitHub'iga.
## Tehnoloogiad
- Git
- GitHub
- Bash
EOF
5.2 Esimene Commit
Näed README.md punases (untracked).
Nüüd rohelises (staged).
5.3 Push GitHub'i
-u = set upstream (edaspidi piisab lihtsalt git push)
Mine GitHub'i → refresh → näed README'd!
5.4 Lisa Skriptid
cat > notes.txt << 'EOF'
Git Labor Märkmed
=================
1. git clone - kopeeri remote repo
2. git add - lisa muudatused staged'i
3. git commit - salvesta snapshot
4. git push - saada GitHub'i
5. git pull - too GitHub'ist
EOF
Commit ja push:
Kontrolli GitHub'is - uued failid seal!
Kontrollnimekiri: - [ ] README GitHub'is näha - [ ] Vähemalt 2 commit'i - [ ] Push töötab ilma vigadeta
6. .gitignore - Mis EI lähe GitHub'i
Probleem: Logifailid, secrets, temp failid ei tohiks kunagi GitHub'i minna. .gitignore defineerib mustri "ignoreeri neid".
6.1 Loo Probleemsed Failid
echo "Error: something broke" > debug.log
mkdir temp
touch temp/cache.tmp
cat > .env << 'EOF'
API_KEY=secret123456
DATABASE_URL=postgresql://localhost/mydb
PASSWORD=SuperSecret
EOF
Git näitab KÕIKI neid! Aga .env sisaldab secrete - see EI TOHI GitHub'i minna.
6.2 Loo .gitignore
cat > .gitignore << 'EOF'
# Logid
*.log
# Temp
temp/
*.tmp
# Secrets
.env
.env.local
*.key
# OS specific
.DS_Store
Thumbs.db
EOF
Nüüd kontrolli:
Näed AINULT .gitignore - ülejäänud ignoreeritud!
Kontrollnimekiri:
- [ ] .gitignore loodud
- [ ] git status EI näita .env ega *.log
- [ ] .gitignore GitHub'is
7. Branch + Pull Request Workflow (Päris Viis!)
Töömaailmas: Keegi EI tee commit'e otse main'i. Alati: loo branch → tee muudatused → push → Pull Request → review → merge.
7.1 Miks Branch'e?
Stsenaarium: Tahad lisada uue feature, aga main peab jääma töökorras. Branch = isoleeritud koopia, kus eksperimenteerid.
main: [v1] → [v2] → [v3]
↓
feature: [A] → [B] → [C]
↓
(merge tagasi)
main: [v1] → [v2] → [v3] → [v4 (sisaldab A+B+C)]
7.2 Loo Feature Branch
See teeb kaks asja:
1. Loob feature/backup-script branch'i
2. Vahetab sinna kohe (checkout)
Kontrolli:
Näed * feature/backup-script (aktiivne) ja main.
7.3 Tööta Branch'is
cat > backup.sh << 'EOF'
#!/bin/bash
# Lihtne varundamise skript
BACKUP_DIR="backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "Alustan varundamist..."
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup_$TIMESTAMP.tar.gz" notes.txt README.md
echo "Varundus valmis: $BACKUP_DIR/backup_$TIMESTAMP.tar.gz"
EOF
chmod +x backup.sh
Testi:
Commit:
7.4 Push Branch'i GitHub'i
Mine GitHub'i → näed branch'i dropdown'is feature/backup-script!
7.5 Tee Pull Request
GitHub'is:
- Kollane banner: "feature/backup-script had recent pushes" → Compare & pull request
- Base:
main← Compare:feature/backup-script - Title:
Lisa backup skript - Description:
## Muudatused
- Lisasin backup.sh skripti
- Loob timestamped archive'id notes.txt ja README'st
## Testimine
- [x] Skript käivitub ilma vigadeta
- [x] Backup fail luuakse õigesti
- Create pull request
7.6 Review ja Merge (Üksinda Õppides)
Päriselt oleks teine inimene review'iks. Õppides teeme ise:
- Files changed tab → vaata diff'i
- Lisaks comment rida peale (valikuline)
- Merge pull request
- Confirm merge
- Delete branch (GitHub'is)
7.7 Uuenda Lokaalne
GitHub'is on nüüd main uuendatud, aga su local main on vana!
Nüüd backup.sh on main'is!
Kustuta lokaalne branch:
Kontrollnimekiri: - [ ] Feature branch loodud - [ ] Commit'id branch'is tehtud - [ ] Push'itud GitHub'i - [ ] Pull Request loodud ja merge'itud - [ ] Local main uuendatud
8. Teine Feature: Dokumentatsioon
Korda sama workflow'd teise feature'ga.
8.1 Loo Branch
git checkout main # alati alusta main'ist!
git pull # võta viimased muudatused
git checkout -b feature/documentation
8.2 Lisa Dokumentatsioon
cat > INSTALL.md << 'EOF'
# Paigaldusjuhend
## Eeldused
- Git 2.0+
- Bash
- Linux/macOS või WSL (Windows)
## Installimine
1. Clone repositoorium:
```bash
git clone git@github.com:KASUTAJANIMI/git-labor.git
cd git-labor
- Tee skriptid käivitatavaks:
- Testi:
Kasutamine
Vaata notes.txt põhikäskude jaoks.
EOF
```bash
cat > USAGE.md << 'EOF'
# Kasutamisjuhend
## Skriptid
### hello.sh
Lihtne tervitusskript:
```bash
./hello.sh
backup.sh
Varundab olulised failid backups/ kausta:
Archive'id nimetatakse timestampiga: backup_20250123_143022.tar.gz
Git Workflow
- Loo feature branch:
git checkout -b feature/nimi - Tee muudatused ja commit'i
- Push:
git push -u origin feature/nimi - Tee Pull Request GitHub'is
- Merge ja kustuta branch EOF
8.4 Pull Request
GitHub'is:
- Compare & pull request
- Title:
Lisa dokumentatsioon (INSTALL ja USAGE) - Description: "Lisasin kasutaja- ja arendajadokumentatsiooni"
- Create PR → Merge → Delete branch
8.5 Uuenda Lokaalne
Kontrollnimekiri: - [ ] Teine PR tehtud ja merge'itud - [ ] INSTALL.md ja USAGE.md main'is
9. Merge Konfliktid (Kahe Arendaja Stsenaarium)
Päris probleem: Sina ja kolleeg muudate sama faili sama kohta. Git ei tea, kumb on õige → konflikt.
Simuleerime: sina töötad branch'is, aga keegi push'is main'i vahepeal muudatuse samasse faili.
9.1 Loo Branch ja Muuda hello.sh
Muuda hello.sh:
cat > hello.sh << 'EOF'
#!/bin/bash
echo "Tere, Git! Kuidas sul läheb täna?"
echo "See on pikendatud tervitus."
EOF
ÄRA PUSH'I VEEL!
9.2 Simuleerime Kolleegi: Muuda main'i Otse
Vaheta tagasi main'i ja tee konflikteeriv muudatus:
Muuda sama fail:
cat > hello.sh << 'EOF'
#!/bin/bash
echo "Hello, Git! Welcome to the project!"
echo "This is an extended greeting in English."
EOF
Nüüd main GitHub'is on erinev su feature branch'ist!
9.3 Proovi Merge'ida - Konflikt!
Vaheta tagasi feature branch'i:
Proovi saada GitHub'i:
See õnnestub (branch ei konflikti). Aga Pull Request'is tekib konflikt!
Mine GitHub'i → Compare & pull request
GitHub näitab: ❌ This branch has conflicts that must be resolved
9.4 Lahenda Konflikt Lokaalselt
GitHub'is võid lahendada veebis, aga töömaailmas tehakse lokaalselt.
Võta main'i muudatused oma branch'i:
Konflikt!
CONFLICT (content): Merge conflict in hello.sh
Automatic merge failed; fix conflicts and then commit the result.
Vaata faili:
Näed:
#!/bin/bash
<<<<<<< HEAD
echo "Tere, Git! Kuidas sul läheb täna?"
echo "See on pikendatud tervitus."
=======
echo "Hello, Git! Welcome to the project!"
echo "This is an extended greeting in English."
>>>>>>> main
Selgitus:
- <<<<<<< HEAD = sinu branch
- ======= = eraldaja
- >>>>>>> main = main'i versioon
9.5 Vali Lahendus
Otsusta, mis jääb. Oletame, et tahame mõlemat:
cat > hello.sh << 'EOF'
#!/bin/bash
echo "Tere / Hello, Git!"
echo "Kuidas sul läheb täna? / How are you today?"
EOF
Märgi lahendatuks:
Lõpeta merge:
Push:
Mine GitHub'i → PR on nüüd merge'itav! ✅
9.6 Merge Pull Request
GitHub'is:
- Refresh PR lehte
- Merge pull request
- Confirm
- Delete branch
Uuenda lokaalne:
Kontrollnimekiri: - [ ] Konflikt tekitatud - [ ] Lahendatud käsitsi - [ ] Merge lõpetatud GitHub'is
10. Fast-Forward Merge (Lokaalne Näide)
Erand: Kui branch pole põhiharu edasi liikunud, tehakse "fast-forward" - lihtne pointeri nihutamine.
Seda kasutatakse harvemini (PR workflow on standard), aga hea teada.
10.1 Loo Branch
10.2 Paranda Typo
Oletame README's on viga:
Muuda midagi (nt lisa rida "## Viimased Uuendused").
10.3 Merge Lokaalselt
Output:
Fast-forward: main lihtsalt "liikus edasi". Pole 3-way merge'i vaja.
Kustuta branch:
Push:
Märkus: Töömaailmas tehaks siiski PR, aga väikeste fiksidega võib ka lokaalselt merge'ida.
Kontrollnimekiri: - [ ] Fast-forward merge tehtud - [ ] Push'itud main'i
11. GitHub Actions Sneak Peek (Valikuline)
Pull Request'idel saab automaatselt teste käitada. Töömaailmas standard - ükski kood ei lähe production'i ilma testideta.
11.1 Loo Workflow
mkdir -p .github/workflows
cat > .github/workflows/test.yml << 'EOF'
name: Test Scripts
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Test hello.sh
run: |
chmod +x hello.sh
./hello.sh
- name: Test backup.sh
run: |
chmod +x backup.sh
./backup.sh
ls backups/
EOF
Tee PR → GitHub'is näed Actions tab'i → testid käivad automaatselt!
Merge PR, kui testid õnnestusid.
Kontrollnimekiri: - [ ] CI workflow loodud - [ ] Testid käivituvad PR'is
Lõplik Kontrollnimekiri
Setup: - [ ] VS Code remote ühendus töötab - [ ] Git konfigureeritud (name, email) - [ ] SSH võti GitHub'is - [ ] Repositoorium clone'itud
Põhitöövoog: - [ ] 5+ commit'i tehtud - [ ] .gitignore seadistatud - [ ] Push/pull töötab
Branch + PR: - [ ] 3+ Pull Request'i tehtud ja merge'itud - [ ] Branch'id kustutatud pärast merge'i - [ ] Local main uuendatud iga kord
Konfliktid: - [ ] Merge konflikt tekitatud - [ ] Lahendatud käsitsi - [ ] Merge lõpetatud
Valikuline: - [ ] CI/CD workflow (GitHub Actions)
Troubleshooting
SSH Permission Denied
Kui ikka ei tööta: - Kontrolli, kas public key on GitHub'is - Kontrolli, kas kasutad SSH URL'd (mitte HTTPS)
Push Rejected (Conflict)
git pull origin main
# Lahenda konfliktid
git add .
git commit -m "Merge main into feature"
git push
Abort Merge
Kui eksid:
Force Delete Branch
Kui Git ei lase kustutada:
Reset Viimane Commit (Kohalik!)
HOIATUS: ÄRA kunagi git reset --hard pärast push'i!
Esitamine
- Kontrolli, et kõik on push'itud:
- README.md alguses peavad olema:
- Kontrolli GitHub'is:
- Vähemalt 5 commit'i
- Kõik failid olemas (README, skriptid, .gitignore, dokid)
-
Closed PR'id (vähemalt 3)
-
Esita link õpetajale:
https://github.com/KASUTAJANIMI/git-labor
Refleksioon
Mõtle läbi ja vasta (ei pea kirjalikult esitama, aga mõtle järele):
- Miks branch'id on paremad kui töötamine otse main'is?
- Mis juhtub, kui kaks inimest muudavad sama faili sama kohta?
- Miks .gitignore on kriitiline (eriti .env failide puhul)?
- Kuidas PR workflow aitab meeskonnatööd?
- Mis on erinevus
git pulljagit fetchvahel? (Google'da, kui ei tea)