Git- ja GitHub-käyttöopas Python-kehitykseen
Tämä ohje on tarkoitettu tilanteeseen, jossa kehität samaa Python-ohjelmaa usealla tietokoneella käyttäen Linux Mintiä, PyCharmia ja GitHubia. Lisäksi ohjelmaa voidaan ajaa Ubuntu-palvelimella.
Tavoitteena on, että GitHubissa on aina projektin yhteinen versio, johon tallennat muutokset yhdeltä koneelta ja josta haet ne toiselle.
1. Miten Git ja GitHub toimivat?
Kaikki koneet käyttävät samaa GitHub-repositoriota. Palvelimelle voidaan hakea testattu versio.
Git toimii paikallisesti jokaisella koneella. GitHub on etäpalvelu, jonka kautta muutokset siirtyvät koneiden välillä.
| Termi | Merkitys |
|---|---|
| Repository (repo) | Projektin Git-versionhallinta |
| Commit | Paikallinen tallennuspiste |
| Push | Lähetä commitit GitHubiin |
| Pull | Hae ja yhdistä muutokset GitHubista |
| Clone | Kopioi projekti uudelle koneelle |
| Branch | Erillinen kehityshaara |
| Merge | Yhdistä kehityshaarat |
.gitignore | Tiedostot, joita Git ei seuraa |
2. Projektin oikea hakemistorakenne
Suosittelen Python-projektiisi esimerkiksi seuraavaa rakennetta:
logocontrol/
├── .git/
├── .gitignore
├── .venv/
├── .env
├── .env.example
├── requirements.txt
├── README.md
├── app.py
├── entsoe.py
├── price_statistics.py
├── settings.example.json
└── tests/
└── test_price_statistics.py
Kaikkia tiedostoja ei pidä tallentaa GitHubiin.
| Tiedosto | GitHubiin? |
|---|---|
| Python-lähdekoodi | Kyllä |
| Testit | Kyllä |
requirements.txt | Kyllä |
README.md | Kyllä |
.gitignore | Kyllä |
.venv/ | Ei |
.env (API-avaimet) | Ei |
settings.json (konekohtainen) | Ei |
__pycache__/ | Ei |
.idea/ | Yleensä ei |
settings.example.json | Kyllä |
Esimerkki .gitignore-tiedostosta:
# Virtual environments
.venv/
venv/
# Python
__pycache__/
*.pyc
.pytest_cache/
.coverage
# IDE
.idea/
# Secrets and local settings
.env
.env.*
!.env.example
settings.json
# Logs
*.log
# Operating system
.DS_Store
Jos jokin tiedosto on jo Gitin seurannassa, pelkkä .gitignore ei poista sitä seurannasta. Käytä esimerkiksi git rm --cached settings.json.
3. Päivittäinen työnkulku usealla koneella
Tämä on koko oppaan tärkein osa.
A. Kun aloitat työskentelyn
cd ~/PycharmProjects/logocontrol
git status
git pull --ff-only
git status kertoo, onko paikallisia muutoksia. git pull --ff-only hakee GitHubin muutokset, mutta ei tee automaattista merge-committia, jos kehityshistoriat ovat eriytyneet. Tämä on turvallinen oletustapa usealla koneella.
Jos paikallisia keskeneräisiä muutoksia on, ratkaise ne ennen pullia esimerkiksi commitilla tai stashilla.
B. Kehitä ja testaa
Muokkaa ohjelmaa PyCharmissa.
pytestKun muutokset toimivat, tarkista:
git status
git diff
C. Tallenna muutokset
git add .
git commit -m "Improve cheapest 3h calculation"git add . lisää muutokset seuraavaan committiin. Tarkista ennen committia git status, ettei mukaan tullut vahingossa ylimääräisiä tiedostoja. Commit tallentuu tässä vaiheessa vain omalle koneelle.
D. Lähetä GitHubiin
git pushNyt toinen tietokone voi hakea muutokset.
Tärkein sääntö: Tee git push ennen kuin lopetat työskentelyn yhdellä koneella, ja git pull --ff-only ennen kuin aloitat toisella.
4. Uuden kehityskoneen käyttöönotto
Oletetaan, että haluat asentaa saman projektin toiselle Linux Mint -koneelle.
Vaihe 1. Asenna tarvittavat ohjelmat
sudo apt update
sudo apt install git python3-venv python3-pip
Vaihe 2. Ota GitHubin SSH-yhteys käyttöön
Luo SSH-avain:
ssh-keygen -t ed25519 -C "oma-kone"Näytä julkinen avain:
cat ~/.ssh/id_ed25519.pubLisää avain GitHubiin kohdassa Settings → SSH and GPG keys.
Testaa:
ssh -T git@github.comJokaiselle tietokoneelle kannattaa luoda oma SSH-avain. Näin yksittäisen koneen avaimen voi tarvittaessa poistaa GitHubista vaikuttamatta muihin koneisiin.
Vaihe 3. Kloonaa projekti
mkdir -p ~/PycharmProjects
cd ~/PycharmProjects
git clone git@github.com:jokinenkalle/logocontrol.git
cd logocontrolJos repositorion nimi tai omistaja on muuttunut, käytä GitHubin näyttämää SSH-osoitetta.
Vaihe 4. Luo virtuaaliympäristö
python3 -m venv .venv
source .venv/bin/activateAsenna riippuvuudet:
pip install -r requirements.txtJos requirements.txt puuttuu, voit luoda sen alkuperäisellä koneella aktivoidusta virtuaaliympäristöstä:
python -m pip freeze > requirements.txtTarkista lista ja committoi tiedosto. pip freeze tallentaa kaikki ympäristön asennetut paketit, myös mahdolliset tarpeettomat kehityspaketit.
Vaihe 5. Avaa PyCharmissa
Avaa kloonattu projektihakemisto ja määritä Python Interpreteriksi:
~/PycharmProjects/logocontrol/.venv/bin/pythonLuo lisäksi konekohtaiset .env ja settings.json esimerkkitiedostojen perusteella.
5. Mitä jos unohdat pushin toisella koneella?
Esimerkki:
- Kone A: teet muutoksia ja commitin, mutta unohdat pushin.
- Kone B: teet muita muutoksia ja pushaat GitHubiin.
- Kone A: yrität tehdä pushin.
Git voi ilmoittaa:
! [rejected] main -> main (fetch first)Tämä tarkoittaa, että GitHubissa on committeja, joita koneella A ei vielä ole.
Ratkaisu, kun työpuu on puhdas:
git fetch origin
git rebase origin/main
git pushrebase siirtää omat paikalliset commitit GitHubista haettujen muutosten päälle. Jos samoja rivejä on muokattu, voi tulla konflikti, joka pitää ratkaista käsin.
Älä käytä git push --force tähän ongelmaan. Se voi ylikirjoittaa muiden koneiden commit-historiaa.
6. Git-branchit – turvallinen tapa kehittää uusia ominaisuuksia
Kun teet isompaa muutosta, kuten uutta ENTSO-E-hintojen optimointia, voit käyttää omaa kehityshaaraa.
Luo uusi haara:
git switch main
git pull --ff-only
git switch -c feature/price-optimizationTee muutoksia ja committoi:
git add .
git commit -m "Add price optimization algorithm"
git push -u origin feature/price-optimizationNyt haara on myös GitHubissa, joten voit jatkaa sen kehitystä toisella koneella.
Toisella koneella:
git fetch origin
git switch --track origin/feature/price-optimizationKun ominaisuus on valmis, voit yhdistää sen main-haaraan esimerkiksi GitHubin Pull Requestilla.
Tällä tavalla keskeneräinen ominaisuus ei sotke toimivaa pääversiota.
7. Ubuntu-palvelin ja GitHub
Jos ohjelma pyörii Ubuntu-palvelimellasi, suosittelen erottamaan kehityksen ja tuotantokäytön.
Kehityskoneilla: muokataan, testataan ja pusketaan muutoksia.
Ubuntu-palvelimella: haetaan vain testattu versio. Palvelimella ei normaalisti tehdä koodimuutoksia.
Palvelimen päivitys voisi olla esimerkiksi:
cd ~/logocontrol
git pull --ff-only
source .venv/bin/activate
pip install -r requirements.txtSen jälkeen käynnistetään ohjelman systemd-palvelu uudelleen tarvittaessa.
Tuotantokäytössä kannattaa ottaa käyttöön versiotagit, jolloin palvelin voidaan päivittää nimenomaan tiettyyn testattuun julkaisuun, eikä aina uusimpaan main-committiin.
8. Yleisimmät Git-komennot
| Komento | Tarkoitus |
|---|---|
git status | Näytä muutokset |
git diff | Näytä tallentamattomat koodimuutokset |
git add . | Lisää muutokset committiin |
git commit -m "viesti" | Tallenna commit |
git push | Lähetä GitHubiin |
git pull --ff-only | Hae uusimmat muutokset |
git fetch | Hae etämuutokset yhdistämättä |
git log --oneline -10 | Näytä 10 viimeisintä committia |
git branch -a | Näytä haarat |
git switch main | Vaihda päähaaraan |
git restore tiedosto.py | Hylkää tiedoston commitoimattomat muutokset |
git stash | Siirrä paikalliset muutokset väliaikaisesti syrjään |
git stash pop | Palauta syrjään siirretyt muutokset |
git remote -v | Näytä GitHub-yhteyden osoite |
9. Harjoittele Git-komentoja
10. Suosittelemani toimintatapa sinulle
Koska kehität samaa Python-projektia usealla koneella ja käytät lisäksi Ubuntu-palvelinta, suosittelen seuraavaa:
mainsisältää aina toimivan version.feature/...-haaroissa kehitetään isommat muutokset ja kokeillaan uusia ominaisuuksia.- Jokaisella koneella on oma
.venv,.envjasettings.json. requirements.txtpidetään versionhallinnassa, jotta riippuvuudet ovat toistettavissa.- Aina ennen kehitystyötä tehdään
git statusjagit pull --ff-only. - Työskentelyn lopuksi tehdään
git add,git commitjagit push. - Ubuntu-palvelimelle viedään vain testattu versio.
Yksi erityisen hyödyllinen lisä olisi automaattinen testaus GitHub Actionsilla: jokainen GitHubiin lähetetty muutos käynnistäisi esimerkiksi pytest-testisi. Näkisit heti, jos ENTSO-E-hintalaskennan tai LOGO-ohjauksen muutokset rikkovat aiemmin toimineita funktioita.
Lisätietoja löytyy myös Pro Git -kirjasta ja GitHubin virallisesta dokumentaatiosta.