11.5 Cvičenie - Upratovanie histórie

Teraz si vyskúšaš všetko, čo sme si povedali v kapitolách 8 až 11, na jednom pripravenom repozitári.

Príprava repozitára

Namiesto zip súboru si repozitár vygeneruješ priamo pomocou pripraveného skriptu - vďaka tomu presne vidíš, ako história vznikla, a vieš si cvičenie kedykoľvek zopakovať od začiatku.

  1. Stiahni si skript priprav_repo.sh
  2. Spusti ho v termináli:
bash priprav_repo.sh
cd git-rebase-cvicenie
  1. Pozri si históriu:
git log --oneline --all --graph

Uvidíš 8 commitov na main a jeden dodatočný commit na vetve feature/typovanie, ktorá odbočuje hneď za Init.

Úlohy

1. Amend

Posledný commit (Pridanie typov k funkcii add (float)) zabudol k funkcii add pridať aj krátky komentár. Do súboru kalkulacka.py pridaj riadok # Vypocita sucet dvoch cisel nad definíciu funkcie a zmenu ulož do tohto istého, posledného commitu pomocou git commit --amend, bez zmeny commit message.

2. Jeden veľký interaktívny rebase

Teraz naraz oprav históriu commitov Init až Pridanie hlavnej funkcie main - všetkých 7 commitov, ktoré predchádzajú tomu, čo si upravoval v kroku 1. Keďže medzi nimi je aj úplne prvý commit (Init), použi:

git rebase -i --root

V otvorenom zozname uprav príkazy tak, aby:

  • commit docasny debug vypis bol zahodený (drop)
  • commit pridanie funkcie nasobenie - preklep v sprave mal prepísanú správu (reword) na Pridanie funkcie násobenie
  • commity wip: zaciatok delenia a wip 2: osetrenie delenia nulou boli zlúčené (squash) do jedného, s výslednou správou Pridanie delenia
  • rebase sa zastavil na commite Pridanie hlavnej funkcie main (edit), aby si doňho mohol pridať zabudnutý testovací súbor

Výsledný zoznam pred uložením teda uprav približne takto:

pick   <hash> Init
pick   <hash> Pridanie odcitania
drop   <hash> docasny debug vypis
reword <hash> pridanie funkcie nasobenie - preklep v sprave
pick   <hash> wip: zaciatok delenia
squash <hash> wip 2: osetrenie delenia nulou
edit   <hash> Pridanie hlavnej funkcie main

Po uložení zoznamu ťa Git postupne vyzve na:

  1. Napísanie novej správy pre commit o násobení (Pridanie funkcie násobenie)
  2. Napísanie výslednej správy pre zlúčený commit o delení (Pridanie delenia)
  3. Zastavenie na commite s main.py - tu vytvor súbor test_kalkulacka.py:
from kalkulacka import add

assert add(2, 3) == 5
print("OK")

pridaj ho do zastaveného commitu a pokračuj:

git add test_kalkulacka.py
git commit --amend --no-edit
git rebase --continue

Na konci si históriu skontroluj pomocou git log --oneline - mala by obsahovať 6 commitov namiesto pôvodných 8.

3. Konflikt

Nakoniec skús spojiť vetvu feature/typovanie s main:

git checkout feature/typovanie
git rebase main

Keďže obe vetvy menia tú istú signatúru funkcie add (raz na int, raz na float), Git ti nahlási konflikt v súbore kalkulacka.py.

  1. Otvor kalkulacka.py a rozhodni sa pre finálnu verziu (napríklad ponechaj float, keďže je všeobecnejšia)
  2. Odstráň konfliktné značky
  3. git add kalkulacka.py
  4. git rebase --continue

Tip: Ak sa v priebehu cvičenia zamotáš, nič sa nedeje - git rebase --abort ťa vždy vráti do stavu pred spustením rebase a môžeš skúsiť znova. V najhoršom prípade skript priprav_repo.sh spusti znova, čím repozitár vygeneruješ nanovo.