Verzování změn

Pokud upravuji nějaký dokument opakovaně a dlouhodoběji, dojdu do stavu, kdy potřebuji ukládat starší a novější verze. Mám několik vhodnějších i méně vhodnějších možností.

Kopie

Nejjednodušší systém je kopie

  1. Vytvořím dokument
  2. Udělám změny
  3. Zkopíruji jej ctrl+c pak ctrl+v
  4. Opakuji (2)

Za nějakou dobu vypadá naše složka následovně:

    # ls
    diplomka.tex
    diplomka (kopie).tex
    diplomka (kopie 2).tex
    ...
    diplomka (kopie 102).tex
  

a nikdo už nezjistí, jaká změna kdy nastala a kdy se mi soubor "totálně rozpadl".

Kopie + přejmenování

Trošku chytřejší verze je přejmenovat soubor podle fáze. Postup je podobný, pouze po vytvoření kopie použijeme f2 a připojíme k názvu vhodný suffix, například -úvod, -implementace-pohybu, -rozbitý-skok, ...

Speciální variantou je pak suffix ve formě $index-$změna, který zachovává řazení dokumentů chronologicky a zároveň řeší problém můžeme očekávat, co v této verzi již je obsaženo. Stále ale vypadá náš disk dosti zmateně:

    # ls
    diplomka.tex
    diplomka002-uvod.tex
    diplomka003-podekovani.tex
    ...
    diplomka123-proc-to-nefunguje.tex
  

git

Git je jeden z verzovacích systémů, který se hojně ujal nejen v programátorských kruzích. Jeho funkce je jednoduchá, sleduje změny v souborovém systému a umožní označit soubory které chceme sledovat a následně potvrdit commit připravené změny do revizí revision. Zaznamenává údaje o změnách, historii a umožňuje i její rozvětvení. Další velkou výhodou gitu je možnost odesílat push a příjimat pull změny z/do vzdálených repozitářů a zjednodušuje tak spolupráci ve větších skupinách.

Cheat-sheet - tahák ke gitu [odt]

git - lokálně

Nejjednodušším použitím je lokální sledování změn v gitu. Vytvořím repozitář, vytvořím soubor(y), řeknu gitu které soubory chci verzovat a pak už jen upravuji a commituji změny.

  1. Vytvořím repozitář git init .
  2. Vytvořím/upravím soubor(y)
  3. Označím soubory určené k verzování git add $soubor
  4. Zapíši změnu git commit -as, git se mě zeptá na detaily změny, které následně ukazuje v historii
  5. Opakuji (2)

Ve složce vidím pouze jednu verzi mých souborů, ale použitím git log zobrazím historii, případně git show $verze i změny od předchozí verze, git diff $verze1..$verze2 změny mezi 2 verzemi. Také se mohu vrátit k nějaké verzi pomocí git checkout $verze, případně smazat současné změny pomocí git reset --hard $verze. Možností je mnoho, a jakmile cokoliv zapíšu commit je velmi pravděpodobné, že se k této verzi budu moci vrátit, ať se děje (téměř) cokoliv.

git - vzdáleně

Předchozí řešení je velmi robustní, neřeší ale problém ztráty počítače (rozbití, vir, ...). Git umožňuje nejenom změny zaznamenávat, ale i odesílat na vzdálené repozitáře repository pomocí git push a git pull. Vzdálený repozitář může být na flash-disku, na síťovém disku, na vzdáleném počítači, nebo v cloudu. Pro uživatele je ale vše transparentní.

  1. Vytvořím repozitář na vzdáleném stroji git init . (případně tlačítkem na githubu/gitlabu/...
  2. Naklonuji si repozitář na můj počítač git clone $cesta-k-repozitáři (například `http://nas_pocitac:8080/ja/muj_repozitar`, nebo `F:\zaloha\muj_repozitar`)
  3. Vytvořím/upravím soubor(y)
  4. Označím soubory určené k verzování git add $soubor
  5. Zapíši změnu git commit -as, git se mě zeptá na detaily změny, které následně ukazuje v historii
  6. Odešlu změny do vzdáleného repozitáře git push (nemusím dělat po každé změně)
  7. Opakuji (3)

gitlab/github/...

Předešlé řešení funguje velmi dobře pro jednoho člověka, případně menší skupinu lidí. Pokud chceme spolupracovat ve větší skupině, je vhodné využít github/gitlab či podobné nástroje, které přidávají systém oprávnění (né každý může zapisovat do mého repozitáře) a také možnost diskutovat o jednotlivých změnách.

  1. Na githubu/gitlabu si vyhledám projekt, do kterého chci přizpívat. Nemohu ovšem přímo posílat změny do hlavního repozitáře, místo toho nejprve projekt rozvětvím na svůj účet fork.
  2. Naklonuji si repozitář na můj počítač git clone $cesta-k-repozitáři (například `http://nas_pocitac:8080/ja/muj_repozitar`, nebo `F:\zaloha\muj_repozitar`)
  3. Rozmyslím si, na čem budu zrovna dnes pracovat a vytvořím si vhodně pojmenovanou větev git checkout -b $nazev_větve
  4. Vytvořím/upravím soubor(y)
  5. Označím soubory určené k verzování git add $soubor
  6. Zapíši změnu git commit -as, git se mě zeptá na detaily změny, které následně ukazuje v historii
  7. Opakuji (4) dokud potřebuji přidávat změny, které se týkají mé větve.
  8. Odešlu změny do svého vzdáleného repozitáře git push
  9. Vytvořím požadavek o začlenění Pull Request/Merge Request na stránkách githubu/gitlabu
  10. Počkám na komentáře od vlastníků veřejného repozitáře, případně přidám další změny, opravím existující změny (git push --force) až jsou jednou spokojení a mou změnu přijmou merge. Od této chvíle všichni uživatelé uvidí mou změnu na hlavních stránkách projektu.
  11. Opakuji (3)

Použití větví branch je velmi přínosné, neboť mohu pracovat na více logických změnách zároveň a přepínat se mezi nimi pomocí git checkout $branch kdykoliv kdy mám všechny změny zaznamenány git commit.

Závěrem

Vždy záleží, na čem pracujeme. Často postačí kopie souboru, ale určitě doporučuji dát gitu šanci alespoň v té nejprostší podobě ať už píšete diplomovou práci, zákon, vytváříte mód do hry, nebo píšete vlastní aplikaci. Začátek není složitý a časem můžete objevit další kouzelné funkce tohoto systému verzí.