Spolupráce a Git

„Opravdové” programy zřídka vznikají prací jednoho člověka. Víc hlav víc ví, a tak je dobré si na projekt vytvořit tým. Každý člen týmu potřebuje mít přístup k práci ostatních. Jak ale zařídit to, aby několik lidí mohlo najednou upravovat stejné části (soubory) programu?

Určitě jste někdy použili nějaký nástroj na sdílení souborů jako je Dropbox nebo OneDrive. Tyto nástroje se většinou moc neumí vyrovnat s tím, když se změní jeden soubor najednou na dvou počítačích. Většinou vytvoří 2 konfliktní kopie a je na uživatelích, aby našli v souborech změny a spojili je.

Takový způsob práce není ve velkém projektu s mnoha programátory udržitelný. Kód je většinou v mnoha souborech a přidání jedné nové funkcionality může vyžadovat změnu ve více souborech. Jen si představte jakou paseku by nadělalo pět programátorů v jedné Dropbox složce.

Zdrojový kód se dá poměrně dobře sdílet a přepoužívat, pokud je napsaný podle určitých pravidel. Spolupráce a sdílení kódu je spjato s programováním od nepaměti, už od prvních počítačů. Tohle přepoužívání se postupně vyvinulo do fenoménu open-source a svobodného softwaru.

Dnes si vyzkoušíme, jak spolupracovat s mnoha programátory na jednom projektu pomocí verzovacího nástroje Git a služby GitHub.

Git a GitHub

Představte si, že jste už napsali větší Python program, který je už kvůli složitosti a velikosti rozdělen do více souborů. Takové složce s kódem říkáme repozitář. Git je program, který se stará o to, abyste ve složce mohli dělat různé experimenty a vrátit se třeba ke starým verzím. Každá verze má ale popis, který jste jí sami dali, takže slouží i jako dobrá dokumentace projektu.

A co víc – Git vám dovoluje sdílet kód s ostatními programátory. Spousta míst na Internetu funguje tak, že vybraná skupina lidí má „přístup”: můžou dělat změny, jak se jim líbí. S Gitem se používá jiný model: změny nahrajeme do vlastního sdíleného repozitáře a majiteli původního projektu napíšeme žádost o začlenění těch změn (angl. pull request). Může to být třeba mail se slovy „Hele, na té a té adrese mám nějaké změny, které by se ti mohly hodit! Přidej je do svého projektu!”

Výhoda je v tom, že se do projektu ‒ pokud je veřejný ‒ může zapojit kdokoliv. Přispěvatel se nemusí předem ptát, nemusí dokazovat že je důvěryhodná osoba, stačí něco změnit a poslat. Jestli se změna bude autorům projektu líbit nebo ne, to už je jiná věc. Ale záleží hlavně na samotné změně, ne na tom, kdo ji udělal. Většina projektů v README obsahuje návod, jak do projektu přispět (angl. Contribution Guidelines). Zkuste se po nich podívat, ušetříte práci sobě i autorům.

Služba GitHub umožňuje vytvořit si vlastní sdílený gitový repozitář a zjednodušuje začleňování změn (místo posílání mailů stačí zmáčknout tlačítko).

Podobných služeb existuje víc (např. bitbucket.org, gitlab.com). Všechny fungují podobně; GitHub je momentálně nejpopulárnější.

Kdybyste měli v různých kopiích repozitáře zmatek, přijde vhod malé vysvětlení: jedna kopie je původní projekt na GitHubu, kam správce projektu dává aktuální „oficiální verzi”. Další kopie na GitHubu je „vaše” a můžete si do ní nahrát cokoliv (nejčastěji se v ní ale zveřejňují změny, které můžou být užitečné pro ostatní). A třetí kopii repozitáře máte u sebe na počítači.

Git workflow

Práce s lokálním repozitářem

Než budeme schopní poslat nějaké změny k začlenění do našeho vybraného projektu, musíme se naučit, jak se s Gitem pracuje. Co je to vlastně ten zmíněný repozitář? Můžeme ho vytvořit z jakéhokoliv adresáře na disku, kde máme uložené soubory, jen Gitu řekneme, že z něj chceme ten repozitář udělat. To má za následek:

  1. Git bude sledovat změny, které ve složce uděláme.
  2. Budeme schopni vytvořit verzi tohoto adresáře, ke které se můžeme kdykoliv vrátit.
  3. Můžeme nastavit vzdálené repozitáře, kam chceme změny nahrávat nebo naopak stahovat změny od jiných lidí.

Pozor

Budeme hodně pracovat s příkazovou řádkou. Jestli se s ní ještě nekamarádíš, koukni se na úvod. Nezapomeň: $ na začátku se nepíše; je tu proto, aby šlo poznat, že jde o příkaz.

Naším dnešním cílem je ale přispět do projektu, který založil někdo jiný. Proto použijeme příkaz git clone ke stažení vzdáleného repozitáře.

$ git clone https://github.com/asgeirrr/prezencka

V aktuálním adresáři se nám vytvořil podadresář prezencka, který obsahuje všechny soubory, které vidíme ve webovém rozhraní na GitHubu.

Stav repozitáře (git status)

Velmi často potřebujeme zjistit současný stav repozitáře. Navigujte v příkazové řádce do adresáře prezencka a zadejte git status. Git nám odpoví:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

Git nám v tuto chvíli poskytl 3 informace:

  1. Že jsme na větvi master. Git umožňuje pracovat na více věcích současně pomocí tzv. větví mezi kterými můžeme přepínat. Pak se na na disku „objeví” verze souborů v dané větvi. My si dnes vystačíme s jednou hlavní větví, která se tradičně jmenuje master.
  2. Že naše větev master je aktuální vůči větvi na vzdáleném repozitáři (origin) na GitHubu.
  3. Že jsme neudělali žádné změny oproti poslední verzi souborů, což je pravda.

První revize (git commit)

Už jsme několikrát zmínili, že Git je verzovací systém. Jak že to ale soubory verzuje? V podstatě mu musíme dát příkaz, aby zmrazil současný stav repozitáře, tzv. vytvořit revizi. Pak můžeme dělat další změny, ale už vždy budeme schopni se k této revizi vrátit.

Přidejte do adresáře prezencka soubor vase_jmeno.txt, např. tedy magdalena_rettigova.txt a do něj napište svoje současné povolání nebo cokoliv jiného. Zkontrolujte současný stav repozitáře pomocí git status: Git oznámí, že v adresáři je soubor, o kterém ještě „neví“.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

      magdalena_rettigova.txt

nothing added to commit but untracked files present (use "git add" to track)

U každého nového souboru musíme Gitu říct, že chceme jeho obsah sledovat. Proveďte to se svým souborem:

$ git add magdalena_rettigova.txt

a znovu zkontrolujte stav repozitáře:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   magdalena_rettigova.txt

To, co je zelené („changes to be committed“), se přidá do další revize (angl. commit), kterou vytvoříme. Pojďme tedy vytvořit revizi:

$ git commit

Po zadání tohoto příkazu se otevře editor, do kterého je nutné napsat výstižný popis změn, abyste vy i ostatní programátoři věděli, co tahle revize obsahuje za změny. Např. tedy Přidáno mé jméno a povolání. Předvyplněné řádky začínající # můžeme nechat být (nebo vymazat, podle chuti – Git je ignoruje). Pak soubor uložíme a zavřeme editor.

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working tree clean

Pro lepší pochopení, co dělají jednotlivé příkazy a v jakém stavu můžou být soubory/změny, přikládáme tento diagram:

Git workflow

Log (git log)

Teď, když za sebou máme první revizi, podívejme se, jak vypadá historie repozitáře, do kterého chceme přispívat. K tomu můžeme použít příkaz git log, jako první uvidíme naši poslední změnu a další jsou změny od jiných autorů, na které navazujeme.

$ git log
commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca
Author: Magdalena Dobromila <magdalena@rettigova.cz>
Date:   Tue Mar 28 19:27:08 2017 +0200

    Přidáno mé jméno a povolání

commit 0f305972803131cb6c8637359fee8ede3005bba6
Merge: effa89b 175f4cc
Author: Oskar Hollmann <oskar@hollmann.me>
Date:   Tue Nov 8 20:17:00 2016 +0100

    Merge pull request #1 from muzikovam/master

    Tady mas jmeno

V logu se pohybujeme šipkami a když z něj chceme vyskočit zpět, stiskneme q jako quit. Příkaz git log má mnoho přepínačů, přehlednější historii změn můžeme získat pomocí git log --oneline --graph --decorate.

Open-source a Free software

Dejme si menší pauzu na zažití základní práce s lokálním repozitářem. Nejde mluvit o Gitu a spolupráci a nezastavit se chvíli u otevřeného zdrojového kódu. První kód vznikal v akademické sféře, kde byl zcela přirozeně sdílen, jako je to s poznatky mezi vědci běžné. 50. a 60. léta byla obdobím velké kreativity, kdy vzniklo mnoho z konceptů a technologií, které dnes používáme. Pak se začalo programování postupně komercializovat a firmy začaly zdrojový kód skrývat jako konkurenční výhodu. Do té doby víceméně jednolitá komunita programátorů byla nucena se rozdělit.

Některým programátorům tohle skrývání kódu hluboce vadilo až roku 1985 publikoval Richard Stallman GNU Manifesto, kde vysvětlil, proč hodlá vytvořit operační systém s otevřeným kódem a odstartoval tak hnutí svobodného softwaru. To prosazuje 4 následujících svobody (převzato z Wikipedie):

  1. svoboda používat program za jakýmkoliv účelem,
  2. svoboda studovat, jak program pracuje a možnost přizpůsobit ho svým potřebám,
  3. svoboda redistribuovat kopie programu,
  4. svoboda vylepšovat program a zveřejňovat zlepšení, aby z nich mohla mít prospěch celá komunita.

Dnes je spousta projektů s otevřeným zdrojovým kódem dostupných na Internetu a každý je používáme. Jejich další sdílení je upraveno jednou z licencí, které tyto základní svobody zaručují.

Pozor

Termíny open-source a free software nejsou zcela zaměnitelné, ale pro naše účely je zatím můžeme chápat jako synonyma.

Spoustu open-source projektů najdete právě na GitHubu. Ne všechny jsou v Pythonu. Ne všechny jsou kvalitní – protože si každý může zveřejnit co chce, na GitHubu se válí spousta nedodělků, opuštěných nápadů a nepodařených experimentů. A bohužel, ne všechny projekty mají přátelské autory.

Na druhou stranu ale open-source programy mají svoje výhody: nejenom se z nich může kdokoli učit, ale každý může i zkontrolovat, jestli dělají to, co dělat mají. Populární open-source programy nás například pravděpodobně nebudou špehovat (tj. hlásit autorovi, co na počítači děláme), ani většinou neobsahují reklamy: kdyby to dělaly, najde se někdo kdo tyhle „funkce” odstraní a lidé časem začnou používat opravenou verzi.

Některé příklady populárních open-source projektů:

  • Mozilla Firefox, Chromium (prohlížeče)
  • Atom, gedit (textové editory)
  • CPython (jazyk Python)
  • Linux, Android (jádra operačních systémů)
  • Pytest (pythonní knihovna na testování)
  • Django, Flask, Requests (webové knihovny pro Python)
  • NumPy, Jupyter, Matplotlib (pythonní knihovny pro vědce a analytiky)
  • Materiály k tomuto kurzu

A jak vidno z posledního příkladu, nejen softwarové projekty se dají vést takhle veřejně. Tento kurz vychází z principů open source: všechno know-how je sdílené a budeme rádi, když se zapojíte.

Pokud vás tato problematika zajímá, doporučujeme krátkou knihu Katedrála a tržiště, která nabízí srovnání open-source s tradičním vývojem softwaru za zavřenými dveřmi.

Pokud budete někdy začínat nový projekt a budete chtít, aby z něj měl prospěch někdo další, stojí za to uvolnit ho pod svobodnou licencí a dát třeba právě na GitHub. Licence projektu většinou najdete v souboru LICENCE. Na kód neuvolněný pod svobodnou licencí se automaticky vztahuje copyright a ostatní ho nemohou volně sdílet.

Informace o open-source licencích najdete např. na choosealicence.com, případně creativecommons.org a opensource.org.

Spolupráce na projektu

Nyní se posuneme ke sdílení revize, kterou jsme vytvořili, a ke stažení revizí od ostatních přispěvatelů.

Posílání změn (git push)

Nyní stačí požádat autora projektu, aby naše změny začlenil do repozitáře na GitHubu a všichni uživatelé projektu, na kterém pracujeme, budou mít užitek z našich změn. Nemáme ale do původního repozitáře práva na zápis, musíme tedy poslat změny nejprve do naší kopie repozitáře, vizte obrázek na začátku.

Udělejte si účet na GitHubu (jestli ho ještě nemáte) a pak jděte na adresu prezencky, kterou jste použili pro git clone. Vpravo nahoře je tlačítko „Fork”, klikněte na něj. Tím se na GitHubu vytvoří vaše kopie repozitáře: adresa by měla být něco jako https://github.com/tvojejmeno/prezencka.

A teď, jak nahrát změny z našeho počítače na GitHub? Git si u každého repozitáře na našem počítači pamatuje adresy, odkud se dají stahovat a kam se dají posílat změny. Seznam těchto adres nám ukáže příkaz git remote -v. Třeba:

$ git remote -v
origin  https://github.com/asgeirrr/prezencka (fetch)
origin  https://github.com/asgeirrr/prezencka (push)

Tenhle výstup znamená, že pod zkratkou origin se schovává adresa, ze které jsme repozitář naklonovali.

Přidejme si podobnou zkratku pro vlastní repozitář na GitHubu. Můžeme ho pojmenovat např. moje nebo svým uživatelským jménem na GitHubu, aby nám bylo jasné, že je to ten náš, do kterého můžeme nahrávat změny.

$ git remote add tvojejmeno https://github.com/tvojejmeno/prezencka

Zkontrolujme, že se nám to povedlo:

$ git remote -v
origin  https://github.com/asgeirrr/prezencka (fetch)
origin  https://github.com/asgeirrr/prezencka (push)
tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)
tvojejmeno  https://github.com/tvojejmeno/prezencka (push)

Tolik k nastavení ‒ git remote add stačí udělat jednou pro každý repozitář. Pak už můžeme změny nahrávat pomocí:

$ git push tvojejmeno master

což znamená: pošli na adresu uloženou pod zkratkou tvojejmeno větev master.

Funguje? Můžeme se podívat na https://github.com/tvojejmeno/prezencka v prohlížeči a ujistit se, že tam změny jsou.

Žádost o začlenění (pull request)

Teď zbývá požádat autory původního projektu, aby změny z tvého sdíleného repozitáře přidali do svojí kopie. GitHub na to má vlastní mechanismus zvaný pull request (žádost o začlenění).

Na stránce původního projektu (na adrese, kterou jsme použili na začátku pro git clone) by mělo být oznámení o nově nahrané větvi s velkým zeleným tlačítkem Compare & pull request. Po kliknutí na tlačítko můžeme doplnit popis toho, co tahle změna obnáší, a pak zmáčkneme další tlačítko.

Hotovo; teď je na autorech projektu, aby se na změny podívali a přijali ‒ nebo začali diskusi o tom, jak ji ještě vylepšit. (Diskutovat se dá na stránce pull requestu nebo přes mail.)

Poznámka

Procházíte-li materiály z domu, musíte počkat, než si někdo žádosti všimne a začlení ji. To může trvat i pár dní; kdyby to bylo přes týden, tak se zkuste se ozvat znovu.

Aktualizace (git pull)

Když budou změny od všech účastníků začleněné, můžeme si aktualizovat repozitář, který máme u sebe na počítači. Příkaz

$ git pull origin master

stáhne změny z větve „master” z adresy pod zkratkou „origin”. Pomocí git log se můžeme podívat, jak se projekt mezitím vyvinul.

Kruh se uzavřel, jsme schopni začlenit do projektu vlastní změny a naopak si stáhnout změny od ostatních. Až příště uvidíte chyby v materiálech nebo nešikovnou formulaci, zkuste to opravit a udělat pull request.

Git je velké téma a mohli bychom probírat větvení nebo řešení konfliktů a spoustu dalšího, ale nechme si to na pokračovací srazy nebo workshop.

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2018/pyladies-praha-podzim-cznic:vcs:0",
      "title": "Spolupráce a Git",
      "html": "\n          \n    \n\n    <h1>Spolupr&#xE1;ce a Git</h1>\n<p>&#x201E;Opravdov&#xE9;&#x201D; programy z&#x159;&#xED;dka vznikaj&#xED; prac&#xED; jednoho &#x10D;lov&#x11B;ka. V&#xED;c hlav v&#xED;c v&#xED;, a tak je dobr&#xE9; si na projekt vytvo&#x159;it t&#xFD;m.\nKa&#x17E;d&#xFD; &#x10D;len t&#xFD;mu pot&#x159;ebuje m&#xED;t p&#x159;&#xED;stup k pr&#xE1;ci ostatn&#xED;ch. Jak ale za&#x159;&#xED;dit to, aby n&#x11B;kolik lid&#xED; mohlo najednou upravovat\nstejn&#xE9; &#x10D;&#xE1;sti (soubory) programu?</p>\n<p>Ur&#x10D;it&#x11B; jste n&#x11B;kdy pou&#x17E;ili n&#x11B;jak&#xFD; n&#xE1;stroj na sd&#xED;len&#xED; soubor&#x16F; jako je Dropbox nebo OneDrive. \nTyto n&#xE1;stroje se v&#x11B;t&#x161;inou moc neum&#xED; vyrovnat s t&#xED;m, kdy&#x17E; se zm&#x11B;n&#xED; jeden soubor najednou na dvou po&#x10D;&#xED;ta&#x10D;&#xED;ch.\nV&#x11B;t&#x161;inou vytvo&#x159;&#xED; 2 konfliktn&#xED; kopie a je na u&#x17E;ivatel&#xED;ch, aby na&#x161;li v souborech zm&#x11B;ny a spojili je.</p>\n<p>Takov&#xFD; zp&#x16F;sob pr&#xE1;ce nen&#xED; ve velk&#xE9;m projektu s mnoha program&#xE1;tory udr&#x17E;iteln&#xFD;. \nK&#xF3;d je v&#x11B;t&#x161;inou v mnoha souborech a p&#x159;id&#xE1;n&#xED; jedn&#xE9; nov&#xE9; funkcionality m&#x16F;&#x17E;e vy&#x17E;adovat zm&#x11B;nu ve v&#xED;ce souborech. \nJen si p&#x159;edstavte jakou paseku by nad&#x11B;lalo p&#x11B;t program&#xE1;tor&#x16F; v jedn&#xE9; Dropbox slo&#x17E;ce.</p>\n<p>Zdrojov&#xFD; k&#xF3;d se d&#xE1; pom&#x11B;rn&#x11B; dob&#x159;e sd&#xED;let a p&#x159;epou&#x17E;&#xED;vat, pokud je napsan&#xFD; podle ur&#x10D;it&#xFD;ch pravidel. \nSpolupr&#xE1;ce a sd&#xED;len&#xED; k&#xF3;du je spjato s programov&#xE1;n&#xED;m od nepam&#x11B;ti, u&#x17E; od prvn&#xED;ch po&#x10D;&#xED;ta&#x10D;&#x16F;.\nTohle p&#x159;epou&#x17E;&#xED;v&#xE1;n&#xED; se postupn&#x11B; vyvinulo do fenom&#xE9;nu <em>open-source</em> a <em>svobodn&#xE9;ho softwaru</em>.</p>\n<p>Dnes si vyzkou&#x161;&#xED;me, jak spolupracovat s mnoha program&#xE1;tory na jednom projektu pomoc&#xED; verzovac&#xED;ho n&#xE1;stroje <em>Git</em> a slu&#x17E;by <em>GitHub</em>.</p>\n<h2>Git a GitHub</h2>\n<p>P&#x159;edstavte si, &#x17E;e jste u&#x17E; napsali v&#x11B;t&#x161;&#xED; Python program, kter&#xFD; je u&#x17E; kv&#x16F;li slo&#x17E;itosti a velikosti rozd&#x11B;len do v&#xED;ce soubor&#x16F;.\nTakov&#xE9; slo&#x17E;ce s k&#xF3;dem &#x159;&#xED;k&#xE1;me repozit&#xE1;&#x159;.\nGit je program, kter&#xFD; se star&#xE1; o to, abyste ve slo&#x17E;ce mohli d&#x11B;lat r&#x16F;zn&#xE9; experimenty a vr&#xE1;tit se t&#x159;eba ke star&#xFD;m verz&#xED;m.\nKa&#x17E;d&#xE1; verze m&#xE1; ale popis, kter&#xFD; jste j&#xED; sami dali, tak&#x17E;e slou&#x17E;&#xED; i jako dobr&#xE1; dokumentace projektu.</p>\n<p>A co v&#xED;c &#x2013; Git v&#xE1;m dovoluje sd&#xED;let k&#xF3;d s ostatn&#xED;mi program&#xE1;tory.\nSpousta m&#xED;st na Internetu funguje tak, &#x17E;e vybran&#xE1; skupina lid&#xED; m&#xE1; &#x201E;p&#x159;&#xED;stup&#x201D;: m&#x16F;&#x17E;ou d&#x11B;lat zm&#x11B;ny, jak se jim l&#xED;b&#xED;.\nS Gitem se pou&#x17E;&#xED;v&#xE1; jin&#xFD; model: zm&#x11B;ny nahrajeme do vlastn&#xED;ho sd&#xED;len&#xE9;ho repozit&#xE1;&#x159;e \na majiteli p&#x16F;vodn&#xED;ho projektu nap&#xED;&#x161;eme &#x17E;&#xE1;dost o za&#x10D;len&#x11B;n&#xED; t&#x11B;ch zm&#x11B;n (angl. pull request). \nM&#x16F;&#x17E;e to b&#xFD;t t&#x159;eba mail se slovy &#x201E;Hele, na t&#xE9; a t&#xE9; adrese m&#xE1;m n&#x11B;jak&#xE9; zm&#x11B;ny, kter&#xE9; by se ti mohly hodit! P&#x159;idej je do sv&#xE9;ho projektu!&#x201D;</p>\n<p>V&#xFD;hoda je v tom, &#x17E;e se do projektu &#x2012; pokud je ve&#x159;ejn&#xFD; &#x2012; m&#x16F;&#x17E;e zapojit kdokoliv. \nP&#x159;isp&#x11B;vatel se nemus&#xED; p&#x159;edem pt&#xE1;t, nemus&#xED; dokazovat &#x17E;e je d&#x16F;v&#x11B;ryhodn&#xE1; osoba, sta&#x10D;&#xED; n&#x11B;co zm&#x11B;nit a poslat. \nJestli se zm&#x11B;na bude autor&#x16F;m projektu l&#xED;bit nebo ne, to u&#x17E; je jin&#xE1; v&#x11B;c. \nAle z&#xE1;le&#x17E;&#xED; hlavn&#x11B; na samotn&#xE9; zm&#x11B;n&#x11B;, ne na tom, kdo ji ud&#x11B;lal.\nV&#x11B;t&#x161;ina projekt&#x16F; v README obsahuje n&#xE1;vod, jak do projektu p&#x159;isp&#x11B;t (angl. Contribution Guidelines).\nZkuste se po nich pod&#xED;vat, u&#x161;et&#x159;&#xED;te pr&#xE1;ci sob&#x11B; i autor&#x16F;m.</p>\n<p>Slu&#x17E;ba <a href=\"https://github.com\">GitHub</a> umo&#x17E;&#x148;uje vytvo&#x159;it si vlastn&#xED; sd&#xED;len&#xFD; gitov&#xFD; repozit&#xE1;&#x159; a zjednodu&#x161;uje za&#x10D;le&#x148;ov&#xE1;n&#xED; zm&#x11B;n \n(m&#xED;sto pos&#xED;l&#xE1;n&#xED; mail&#x16F; sta&#x10D;&#xED; zm&#xE1;&#x10D;knout tla&#x10D;&#xED;tko).</p>\n<p>Podobn&#xFD;ch slu&#x17E;eb existuje v&#xED;c (nap&#x159;. bitbucket.org, gitlab.com). V&#x161;echny funguj&#xED; podobn&#x11B;; GitHub je moment&#xE1;ln&#x11B; nejpopul&#xE1;rn&#x11B;j&#x161;&#xED;.</p>\n<p>Kdybyste m&#x11B;li v r&#x16F;zn&#xFD;ch kopi&#xED;ch repozit&#xE1;&#x159;e zmatek, p&#x159;ijde vhod mal&#xE9; vysv&#x11B;tlen&#xED;: jedna kopie je p&#x16F;vodn&#xED; projekt na GitHubu, \nkam spr&#xE1;vce projektu d&#xE1;v&#xE1; aktu&#xE1;ln&#xED; &#x201E;ofici&#xE1;ln&#xED; verzi&#x201D;.\nDal&#x161;&#xED; kopie na GitHubu je &#x201E;va&#x161;e&#x201D; a m&#x16F;&#x17E;ete si do n&#xED; nahr&#xE1;t cokoliv\n(nej&#x10D;ast&#x11B;ji se v n&#xED; ale zve&#x159;ej&#x148;uj&#xED; zm&#x11B;ny, kter&#xE9; m&#x16F;&#x17E;ou b&#xFD;t u&#x17E;ite&#x10D;n&#xE9; pro ostatn&#xED;).\nA t&#x159;et&#xED; kopii repozit&#xE1;&#x159;e m&#xE1;te u sebe na po&#x10D;&#xED;ta&#x10D;i.</p>\n<p><img src=\"/2018/pyladies-praha-podzim-cznic/git/git-collaboration-2in1/static/gh-workflow-diagram.svg\" alt=\"Git workflow\"></p>\n<h3>Pr&#xE1;ce s lok&#xE1;ln&#xED;m repozit&#xE1;&#x159;em</h3>\n<p>Ne&#x17E; budeme schopn&#xED; poslat n&#x11B;jak&#xE9; zm&#x11B;ny k za&#x10D;len&#x11B;n&#xED; do na&#x161;eho vybran&#xE9;ho projektu, mus&#xED;me se nau&#x10D;it, jak se s Gitem pracuje.\nCo je to vlastn&#x11B; ten zm&#xED;n&#x11B;n&#xFD; <em>repozit&#xE1;&#x159;</em>? M&#x16F;&#x17E;eme ho vytvo&#x159;it z jak&#xE9;hokoliv adres&#xE1;&#x159;e na disku, kde m&#xE1;me ulo&#x17E;en&#xE9; soubory, \njen Gitu &#x159;ekneme, &#x17E;e z n&#x11B;j chceme ten repozit&#xE1;&#x159; ud&#x11B;lat. To m&#xE1; za n&#xE1;sledek:</p>\n<ol>\n<li>Git bude sledovat zm&#x11B;ny, kter&#xE9; ve slo&#x17E;ce ud&#x11B;l&#xE1;me.</li>\n<li>Budeme schopni vytvo&#x159;it verzi tohoto adres&#xE1;&#x159;e, ke kter&#xE9; se m&#x16F;&#x17E;eme kdykoliv vr&#xE1;tit.</li>\n<li>M&#x16F;&#x17E;eme nastavit vzd&#xE1;len&#xE9; repozit&#xE1;&#x159;e, kam chceme zm&#x11B;ny nahr&#xE1;vat nebo naopak stahovat zm&#x11B;ny od jin&#xFD;ch lid&#xED;. </li>\n</ol>\n<div class=\"admonition note\"><p class=\"admonition-title\">Pozor</p>\n<p>Budeme hodn&#x11B; pracovat s p&#x159;&#xED;kazovou &#x159;&#xE1;dkou. Jestli se s n&#xED; je&#x161;t&#x11B; nekamar&#xE1;d&#xED;&#x161;, koukni se na <a href=\"/2018/pyladies-praha-podzim-cznic/beginners/cmdline/\">&#xFA;vod</a>.\nNezapome&#x148;: $ na za&#x10D;&#xE1;tku se nep&#xED;&#x161;e; je tu proto, aby &#x161;lo poznat, &#x17E;e jde o p&#x159;&#xED;kaz.</p>\n</div><p>Na&#x161;&#xED;m dne&#x161;n&#xED;m c&#xED;lem je ale p&#x159;isp&#x11B;t do projektu, kter&#xFD; zalo&#x17E;il n&#x11B;kdo jin&#xFD;. Proto pou&#x17E;ijeme p&#x159;&#xED;kaz <code>git clone</code> ke sta&#x17E;en&#xED; vzd&#xE1;len&#xE9;ho repozit&#xE1;&#x159;e.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git clone https://github.com/asgeirrr/prezencka\n</pre></div><p>V aktu&#xE1;ln&#xED;m adres&#xE1;&#x159;i se n&#xE1;m vytvo&#x159;il podadres&#xE1;&#x159; <code>prezencka</code>, kter&#xFD; obsahuje v&#x161;echny soubory, kter&#xE9; vid&#xED;me ve webov&#xE9;m rozhran&#xED; na <a href=\"https://github.com/asgeirrr/prezencka\">GitHubu</a>.</p>\n<h4>Stav repozit&#xE1;&#x159;e (<code>git status</code>)</h4>\n<p>Velmi &#x10D;asto pot&#x159;ebujeme zjistit sou&#x10D;asn&#xFD; stav repozit&#xE1;&#x159;e. Navigujte v p&#x159;&#xED;kazov&#xE9; &#x159;&#xE1;dce do adres&#xE1;&#x159;e <code>prezencka</code> a zadejte <code>git status</code>. Git n&#xE1;m odpov&#xED;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git status\n<span class=\"go\">On branch master</span>\n<span class=\"go\">Your branch is up-to-date with &apos;origin/master&apos;.</span>\n<span class=\"go\">nothing to commit, working tree clean</span>\n</pre></div><p>Git n&#xE1;m v tuto chv&#xED;li poskytl 3 informace:</p>\n<ol>\n<li>&#x17D;e jsme na v&#x11B;tvi <code>master</code>. Git umo&#x17E;&#x148;uje pracovat na v&#xED;ce v&#x11B;c&#xED;ch sou&#x10D;asn&#x11B; pomoc&#xED; tzv. <em>v&#x11B;tv&#xED;</em> mezi kter&#xFD;mi m&#x16F;&#x17E;eme p&#x159;ep&#xED;nat. Pak se na na disku &#x201E;objev&#xED;&#x201D; verze soubor&#x16F; v dan&#xE9; v&#x11B;tvi. My si dnes vysta&#x10D;&#xED;me s jednou hlavn&#xED; v&#x11B;tv&#xED;, kter&#xE1; se tradi&#x10D;n&#x11B; jmenuje <code>master</code>.</li>\n<li>&#x17D;e na&#x161;e v&#x11B;tev <code>master</code> je aktu&#xE1;ln&#xED; v&#x16F;&#x10D;i v&#x11B;tvi na vzd&#xE1;len&#xE9;m repozit&#xE1;&#x159;i (origin) na GitHubu.</li>\n<li>&#x17D;e jsme neud&#x11B;lali &#x17E;&#xE1;dn&#xE9; zm&#x11B;ny oproti posledn&#xED; verzi soubor&#x16F;, co&#x17E; je pravda.</li>\n</ol>\n<h4>Prvn&#xED; revize (<code>git commit</code>)</h4>\n<p>U&#x17E; jsme n&#x11B;kolikr&#xE1;t zm&#xED;nili, &#x17E;e Git je verzovac&#xED; syst&#xE9;m. Jak &#x17E;e to ale soubory verzuje? \nV podstat&#x11B; mu mus&#xED;me d&#xE1;t p&#x159;&#xED;kaz, aby zmrazil sou&#x10D;asn&#xFD; stav repozit&#xE1;&#x159;e, tzv. vytvo&#x159;it <em>revizi</em>.\nPak m&#x16F;&#x17E;eme d&#x11B;lat dal&#x161;&#xED; zm&#x11B;ny, ale u&#x17E; v&#x17E;dy budeme schopni se k t&#xE9;to revizi vr&#xE1;tit.</p>\n<p>P&#x159;idejte do adres&#xE1;&#x159;e <code>prezencka</code> soubor <code>vase_jmeno.txt</code>, nap&#x159;. tedy <code>magdalena_rettigova.txt</code>\na do n&#x11B;j napi&#x161;te svoje sou&#x10D;asn&#xE9; povol&#xE1;n&#xED; nebo cokoliv jin&#xE9;ho.\nZkontrolujte sou&#x10D;asn&#xFD; stav repozit&#xE1;&#x159;e pomoc&#xED; <code>git status</code>: Git ozn&#xE1;m&#xED;, &#x17E;e v adres&#xE1;&#x159;i je soubor, o kter&#xE9;m je&#x161;t&#x11B; &#x201E;nev&#xED;&#x201C;.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git status\n<span class=\"go\">On branch master</span>\n<span class=\"go\">Your branch is up-to-date with &apos;origin/master&apos;.</span>\n<span class=\"go\">Untracked files:</span>\n<span class=\"go\">  (use &quot;git add &lt;file&gt;...&quot; to include in what will be committed)</span>\n\n<span class=\"go\">      magdalena_rettigova.txt</span>\n\n<span class=\"go\">nothing added to commit but untracked files present (use &quot;git add&quot; to track)</span>\n</pre></div><p>U ka&#x17E;d&#xE9;ho nov&#xE9;ho souboru mus&#xED;me Gitu &#x159;&#xED;ct, &#x17E;e chceme jeho obsah sledovat. Prove&#x10F;te to se sv&#xFD;m souborem:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git add magdalena_rettigova.txt\n</pre></div><p>a znovu zkontrolujte stav repozit&#xE1;&#x159;e:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git status\n<span class=\"go\">On branch master</span>\n<span class=\"go\">Your branch is up-to-date with &apos;origin/master&apos;.</span>\n<span class=\"go\">Changes to be committed:</span>\n<span class=\"go\">  (use &quot;git reset HEAD &lt;file&gt;...&quot; to unstage)</span>\n\n<span class=\"go\">        new file:   magdalena_rettigova.txt</span>\n</pre></div><p>To, co je zelen&#xE9; (&#x201E;changes to be committed&#x201C;), se p&#x159;id&#xE1; do dal&#x161;&#xED; revize (angl. commit), kterou vytvo&#x159;&#xED;me. Poj&#x10F;me tedy vytvo&#x159;it revizi:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git commit\n</pre></div><p>Po zad&#xE1;n&#xED; tohoto p&#x159;&#xED;kazu se otev&#x159;e editor, do kter&#xE9;ho je nutn&#xE9; napsat v&#xFD;sti&#x17E;n&#xFD; popis zm&#x11B;n, \nabyste vy i ostatn&#xED; program&#xE1;to&#x159;i v&#x11B;d&#x11B;li, co tahle revize obsahuje za zm&#x11B;ny.\nNap&#x159;. tedy <code>P&#x159;id&#xE1;no m&#xE9; jm&#xE9;no a povol&#xE1;n&#xED;</code>. P&#x159;edvypln&#x11B;n&#xE9; &#x159;&#xE1;dky za&#x10D;&#xED;naj&#xED;c&#xED; # m&#x16F;&#x17E;eme nechat b&#xFD;t\n(nebo vymazat, podle chuti &#x2013; Git je ignoruje).\nPak soubor ulo&#x17E;&#xED;me a zav&#x159;eme editor.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git status\n<span class=\"go\">On branch master</span>\n<span class=\"go\">Your branch is ahead of &apos;origin/master&apos; by 1 commit.</span>\n<span class=\"go\">  (use &quot;git push&quot; to publish your local commits)</span>\n<span class=\"go\">nothing to commit, working tree clean</span>\n</pre></div><p>Pro lep&#x161;&#xED; pochopen&#xED;, co d&#x11B;laj&#xED; jednotliv&#xE9; p&#x159;&#xED;kazy a v jak&#xE9;m stavu m&#x16F;&#x17E;ou b&#xFD;t soubory/zm&#x11B;ny, p&#x159;ikl&#xE1;d&#xE1;me tento diagram:</p>\n<p><img src=\"/2018/pyladies-praha-podzim-cznic/git/git-collaboration-2in1/static/diagram.png\" alt=\"Git workflow\"></p>\n<h4>Log (<code>git log</code>)</h4>\n<p>Te&#x10F;, kdy&#x17E; za sebou m&#xE1;me prvn&#xED; revizi, pod&#xED;vejme se, jak vypad&#xE1; historie repozit&#xE1;&#x159;e, do kter&#xE9;ho chceme p&#x159;isp&#xED;vat.\nK tomu m&#x16F;&#x17E;eme pou&#x17E;&#xED;t p&#x159;&#xED;kaz <code>git log</code>, jako prvn&#xED; uvid&#xED;me na&#x161;i posledn&#xED; zm&#x11B;nu a dal&#x161;&#xED; jsou zm&#x11B;ny od jin&#xFD;ch autor&#x16F;,\nna kter&#xE9; navazujeme.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git log\n<span class=\"go\">commit 0bdfbb2a2398fea179395a8dd303e9f672ef4dca</span>\n<span class=\"go\">Author: Magdalena Dobromila &lt;magdalena@rettigova.cz&gt;</span>\n<span class=\"go\">Date:   Tue Mar 28 19:27:08 2017 +0200</span>\n\n<span class=\"go\">    P&#x159;id&#xE1;no m&#xE9; jm&#xE9;no a povol&#xE1;n&#xED;</span>\n\n<span class=\"go\">commit 0f305972803131cb6c8637359fee8ede3005bba6</span>\n<span class=\"go\">Merge: effa89b 175f4cc</span>\n<span class=\"go\">Author: Oskar Hollmann &lt;oskar@hollmann.me&gt;</span>\n<span class=\"go\">Date:   Tue Nov 8 20:17:00 2016 +0100</span>\n\n<span class=\"go\">    Merge pull request #1 from muzikovam/master</span>\n\n<span class=\"go\">    Tady mas jmeno</span>\n</pre></div><p>V logu se pohybujeme &#x161;ipkami a kdy&#x17E; z n&#x11B;j chceme vysko&#x10D;it zp&#x11B;t, stiskneme <code>q</code> jako quit.\nP&#x159;&#xED;kaz <code>git log</code> m&#xE1; mnoho p&#x159;ep&#xED;na&#x10D;&#x16F;, p&#x159;ehledn&#x11B;j&#x161;&#xED; historii zm&#x11B;n m&#x16F;&#x17E;eme z&#xED;skat pomoc&#xED; <code>git log --oneline --graph --decorate</code>.</p>\n<h2>Open-source a Free software</h2>\n<p>Dejme si men&#x161;&#xED; pauzu na za&#x17E;it&#xED; z&#xE1;kladn&#xED; pr&#xE1;ce s lok&#xE1;ln&#xED;m repozit&#xE1;&#x159;em.\nNejde mluvit o Gitu a spolupr&#xE1;ci a nezastavit se chv&#xED;li u otev&#x159;en&#xE9;ho zdrojov&#xE9;ho k&#xF3;du.\nPrvn&#xED; k&#xF3;d vznikal v akademick&#xE9; sf&#xE9;&#x159;e, kde byl zcela p&#x159;irozen&#x11B; sd&#xED;len, jako je to s poznatky mezi v&#x11B;dci b&#x11B;&#x17E;n&#xE9;.\n50. a 60. l&#xE9;ta byla obdob&#xED;m velk&#xE9; kreativity, kdy vzniklo mnoho z koncept&#x16F; a technologi&#xED;, kter&#xE9; dnes pou&#x17E;&#xED;v&#xE1;me.\nPak se za&#x10D;alo programov&#xE1;n&#xED; postupn&#x11B; komercializovat a firmy za&#x10D;aly zdrojov&#xFD; k&#xF3;d skr&#xFD;vat jako konkuren&#x10D;n&#xED; v&#xFD;hodu.\nDo t&#xE9; doby v&#xED;cem&#xE9;n&#x11B; jednolit&#xE1; komunita program&#xE1;tor&#x16F; byla nucena se rozd&#x11B;lit.</p>\n<p>N&#x11B;kter&#xFD;m program&#xE1;tor&#x16F;m tohle skr&#xFD;v&#xE1;n&#xED; k&#xF3;du hluboce vadilo a&#x17E; roku 1985 publikoval \n<a href=\"https://en.wikipedia.org/wiki/Richard_Stallman\">Richard Stallman</a> GNU Manifesto,\nkde vysv&#x11B;tlil, pro&#x10D; hodl&#xE1; vytvo&#x159;it opera&#x10D;n&#xED; syst&#xE9;m s otev&#x159;en&#xFD;m k&#xF3;dem a odstartoval tak hnut&#xED; svobodn&#xE9;ho softwaru.\nTo prosazuje 4 n&#xE1;sleduj&#xED;c&#xED;ch svobody (p&#x159;evzato z <a href=\"https://cs.wikipedia.org/wiki/Svobodn%C3%BD_software\">Wikipedie</a>):</p>\n<ol>\n<li>svoboda pou&#x17E;&#xED;vat program za jak&#xFD;mkoliv &#xFA;&#x10D;elem,</li>\n<li>svoboda studovat, jak program pracuje a mo&#x17E;nost p&#x159;izp&#x16F;sobit ho sv&#xFD;m pot&#x159;eb&#xE1;m,</li>\n<li>svoboda redistribuovat kopie programu,</li>\n<li>svoboda vylep&#x161;ovat program a zve&#x159;ej&#x148;ovat zlep&#x161;en&#xED;, aby z nich mohla m&#xED;t prosp&#x11B;ch cel&#xE1; komunita.</li>\n</ol>\n<p>Dnes je spousta projekt&#x16F; s otev&#x159;en&#xFD;m zdrojov&#xFD;m k&#xF3;dem dostupn&#xFD;ch na Internetu a ka&#x17E;d&#xFD; je pou&#x17E;&#xED;v&#xE1;me. \nJejich dal&#x161;&#xED; sd&#xED;len&#xED; je upraveno jednou z licenc&#xED;, kter&#xE9; tyto z&#xE1;kladn&#xED; svobody zaru&#x10D;uj&#xED;.</p>\n<div class=\"admonition note\"><p class=\"admonition-title\">Pozor</p>\n<p>Term&#xED;ny <strong>open-source</strong> a <strong>free software</strong> nejsou zcela zam&#x11B;niteln&#xE9;, ale pro na&#x161;e &#xFA;&#x10D;ely je zat&#xED;m m&#x16F;&#x17E;eme ch&#xE1;pat jako synonyma.</p>\n</div><p>Spoustu open-source projekt&#x16F; najdete pr&#xE1;v&#x11B; na GitHubu. Ne v&#x161;echny jsou v Pythonu. Ne v&#x161;echny jsou kvalitn&#xED; &#x2013;\nproto&#x17E;e si ka&#x17E;d&#xFD; m&#x16F;&#x17E;e zve&#x159;ejnit co chce, na GitHubu se v&#xE1;l&#xED; spousta nedod&#x11B;lk&#x16F;, opu&#x161;t&#x11B;n&#xFD;ch n&#xE1;pad&#x16F; a nepoda&#x159;en&#xFD;ch experiment&#x16F;. \nA bohu&#x17E;el, ne v&#x161;echny projekty maj&#xED; p&#x159;&#xE1;telsk&#xE9; autory.</p>\n<p>Na druhou stranu ale open-source programy maj&#xED; svoje v&#xFD;hody: nejenom se z nich m&#x16F;&#x17E;e kdokoli u&#x10D;it, \nale ka&#x17E;d&#xFD; m&#x16F;&#x17E;e i zkontrolovat, jestli d&#x11B;laj&#xED; to, co d&#x11B;lat maj&#xED;.\nPopul&#xE1;rn&#xED; open-source programy n&#xE1;s nap&#x159;&#xED;klad pravd&#x11B;podobn&#x11B; nebudou &#x161;pehovat (tj. hl&#xE1;sit autorovi, co na po&#x10D;&#xED;ta&#x10D;i d&#x11B;l&#xE1;me), \nani v&#x11B;t&#x161;inou neobsahuj&#xED; reklamy: kdyby to d&#x11B;laly, najde se n&#x11B;kdo kdo tyhle &#x201E;funkce&#x201D; odstran&#xED; \na lid&#xE9; &#x10D;asem za&#x10D;nou pou&#x17E;&#xED;vat opravenou verzi.</p>\n<p>N&#x11B;kter&#xE9; p&#x159;&#xED;klady popul&#xE1;rn&#xED;ch open-source projekt&#x16F;:</p>\n<ul>\n<li>Mozilla Firefox, Chromium (prohl&#xED;&#x17E;e&#x10D;e)</li>\n<li>Atom, gedit (textov&#xE9; editory)</li>\n<li>CPython (jazyk Python)</li>\n<li>Linux, Android (j&#xE1;dra opera&#x10D;n&#xED;ch syst&#xE9;m&#x16F;)</li>\n<li>Pytest (pythonn&#xED; knihovna na testov&#xE1;n&#xED;)</li>\n<li>Django, Flask, Requests (webov&#xE9; knihovny pro Python)</li>\n<li>NumPy, Jupyter, Matplotlib (pythonn&#xED; knihovny pro v&#x11B;dce a analytiky)</li>\n<li>Materi&#xE1;ly k tomuto kurzu</li>\n</ul>\n<p>A jak vidno z posledn&#xED;ho p&#x159;&#xED;kladu, nejen softwarov&#xE9; projekty se daj&#xED; v&#xE9;st takhle ve&#x159;ejn&#x11B;. Tento kurz vych&#xE1;z&#xED; z princip&#x16F; open source: \nv&#x161;echno know-how je sd&#xED;len&#xE9; a budeme r&#xE1;di, kdy&#x17E; se zapoj&#xED;te.</p>\n<p>Pokud v&#xE1;s tato problematika zaj&#xED;m&#xE1;, doporu&#x10D;ujeme kr&#xE1;tkou knihu <a href=\"https://www.root.cz/knihy/katedrala-a-trziste/\">Katedr&#xE1;la a tr&#x17E;i&#x161;t&#x11B;</a>, kter&#xE1; nab&#xED;z&#xED; srovn&#xE1;n&#xED; open-source s tradi&#x10D;n&#xED;m v&#xFD;vojem softwaru za zav&#x159;en&#xFD;mi dve&#x159;mi.</p>\n<p>Pokud budete n&#x11B;kdy za&#x10D;&#xED;nat nov&#xFD; projekt a budete cht&#xED;t, aby z n&#x11B;j m&#x11B;l prosp&#x11B;ch n&#x11B;kdo dal&#x161;&#xED;,\nstoj&#xED; za to uvolnit ho pod svobodnou licenc&#xED; a d&#xE1;t t&#x159;eba pr&#xE1;v&#x11B; na GitHub.\nLicence projektu v&#x11B;t&#x161;inou najdete v souboru <code>LICENCE</code>. \nNa k&#xF3;d neuvoln&#x11B;n&#xFD; pod svobodnou licenc&#xED; se automaticky vztahuje copyright a ostatn&#xED; ho nemohou voln&#x11B; sd&#xED;let.</p>\n<p>Informace o open-source licenc&#xED;ch najdete nap&#x159;. na <a href=\"https://choosealicense.com\">choosealicence.com</a>, p&#x159;&#xED;padn&#x11B; <a href=\"https://creativecommons.org\">creativecommons.org</a> a <a href=\"https://opensource.org\">opensource.org</a>.</p>\n<h2>Spolupr&#xE1;ce na projektu</h2>\n<p>Nyn&#xED; se posuneme ke sd&#xED;len&#xED; revize, kterou jsme vytvo&#x159;ili, a ke sta&#x17E;en&#xED; reviz&#xED; od ostatn&#xED;ch p&#x159;isp&#x11B;vatel&#x16F;.</p>\n<h3>Pos&#xED;l&#xE1;n&#xED; zm&#x11B;n (<code>git push</code>)</h3>\n<p>Nyn&#xED; sta&#x10D;&#xED; po&#x17E;&#xE1;dat autora projektu, aby na&#x161;e zm&#x11B;ny za&#x10D;lenil do repozit&#xE1;&#x159;e na GitHubu \na v&#x161;ichni u&#x17E;ivatel&#xE9; projektu, na kter&#xE9;m pracujeme, budou m&#xED;t u&#x17E;itek z na&#x161;ich zm&#x11B;n.\nNem&#xE1;me ale do p&#x16F;vodn&#xED;ho repozit&#xE1;&#x159;e pr&#xE1;va na z&#xE1;pis, mus&#xED;me tedy poslat zm&#x11B;ny nejprve do na&#x161;&#xED; kopie repozit&#xE1;&#x159;e,\nvizte obr&#xE1;zek na za&#x10D;&#xE1;tku.</p>\n<p>Ud&#x11B;lejte si &#xFA;&#x10D;et na GitHubu (jestli ho je&#x161;t&#x11B; nem&#xE1;te) a pak jd&#x11B;te na adresu <a href=\"https://github.com/asgeirrr/prezencka/\">prezencky</a>,\nkterou jste pou&#x17E;ili pro <code>git clone</code>. \nVpravo naho&#x159;e je tla&#x10D;&#xED;tko &#x201E;Fork&#x201D;, klikn&#x11B;te na n&#x11B;j. T&#xED;m se na GitHubu vytvo&#x159;&#xED; va&#x161;e kopie repozit&#xE1;&#x159;e:\nadresa by m&#x11B;la b&#xFD;t n&#x11B;co jako <code>https://github.com/tvojejmeno/prezencka</code>.</p>\n<p>A te&#x10F;, jak nahr&#xE1;t zm&#x11B;ny z na&#x161;eho po&#x10D;&#xED;ta&#x10D;e na GitHub? Git si u ka&#x17E;d&#xE9;ho repozit&#xE1;&#x159;e na na&#x161;em po&#x10D;&#xED;ta&#x10D;i pamatuje adresy, \nodkud se daj&#xED; stahovat a kam se daj&#xED; pos&#xED;lat zm&#x11B;ny. \nSeznam t&#x11B;chto adres n&#xE1;m uk&#xE1;&#x17E;e p&#x159;&#xED;kaz <code>git remote -v</code>. T&#x159;eba:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git remote -v\n<span class=\"go\">origin  https://github.com/asgeirrr/prezencka (fetch)</span>\n<span class=\"go\">origin  https://github.com/asgeirrr/prezencka (push)</span>\n</pre></div><p>Tenhle v&#xFD;stup znamen&#xE1;, &#x17E;e pod zkratkou <em>origin</em> se schov&#xE1;v&#xE1; adresa, ze kter&#xE9; jsme repozit&#xE1;&#x159; naklonovali.</p>\n<p>P&#x159;idejme si podobnou zkratku pro vlastn&#xED; repozit&#xE1;&#x159; na GitHubu. M&#x16F;&#x17E;eme ho pojmenovat nap&#x159;. <em>moje</em>\nnebo sv&#xFD;m u&#x17E;ivatelsk&#xFD;m jm&#xE9;nem na GitHubu,\naby n&#xE1;m bylo jasn&#xE9;, &#x17E;e je to ten n&#xE1;&#x161;, do kter&#xE9;ho m&#x16F;&#x17E;eme nahr&#xE1;vat zm&#x11B;ny.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git remote add tvojejmeno https://github.com/tvojejmeno/prezencka\n</pre></div><p>Zkontrolujme, &#x17E;e se n&#xE1;m to povedlo:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git remote -v\n<span class=\"go\">origin  https://github.com/asgeirrr/prezencka (fetch)</span>\n<span class=\"go\">origin  https://github.com/asgeirrr/prezencka (push)</span>\n<span class=\"go\">tvojejmeno  https://github.com/tvojejmeno/prezencka (fetch)</span>\n<span class=\"go\">tvojejmeno  https://github.com/tvojejmeno/prezencka (push)</span>\n</pre></div><p>Tolik k nastaven&#xED; &#x2012; <code>git remote add</code> sta&#x10D;&#xED; ud&#x11B;lat jednou pro ka&#x17E;d&#xFD; repozit&#xE1;&#x159;. Pak u&#x17E; m&#x16F;&#x17E;eme zm&#x11B;ny nahr&#xE1;vat pomoc&#xED;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git push tvojejmeno master\n</pre></div><p>co&#x17E; znamen&#xE1;: po&#x161;li na adresu ulo&#x17E;enou pod zkratkou <code>tvojejmeno</code> v&#x11B;tev <code>master</code>.</p>\n<p>Funguje? M&#x16F;&#x17E;eme se pod&#xED;vat na <code>https://github.com/tvojejmeno/prezencka</code> v prohl&#xED;&#x17E;e&#x10D;i a ujistit se, &#x17E;e tam zm&#x11B;ny jsou.</p>\n<h3>&#x17D;&#xE1;dost o za&#x10D;len&#x11B;n&#xED; (pull request)</h3>\n<p>Te&#x10F; zb&#xFD;v&#xE1; po&#x17E;&#xE1;dat autory p&#x16F;vodn&#xED;ho projektu, aby zm&#x11B;ny z tv&#xE9;ho sd&#xED;len&#xE9;ho repozit&#xE1;&#x159;e p&#x159;idali do svoj&#xED; kopie. \nGitHub na to m&#xE1; vlastn&#xED; mechanismus zvan&#xFD; <em>pull request</em> (&#x17E;&#xE1;dost o za&#x10D;len&#x11B;n&#xED;).</p>\n<p>Na str&#xE1;nce p&#x16F;vodn&#xED;ho projektu (na adrese, kterou jsme pou&#x17E;ili na za&#x10D;&#xE1;tku pro <code>git clone</code>)\nby m&#x11B;lo b&#xFD;t ozn&#xE1;men&#xED; o nov&#x11B; nahran&#xE9; v&#x11B;tvi s velk&#xFD;m zelen&#xFD;m tla&#x10D;&#xED;tkem <code>Compare &amp; pull request</code>. \nPo kliknut&#xED; na tla&#x10D;&#xED;tko m&#x16F;&#x17E;eme doplnit popis toho, co tahle zm&#x11B;na obn&#xE1;&#x161;&#xED;, a pak zm&#xE1;&#x10D;kneme dal&#x161;&#xED; tla&#x10D;&#xED;tko.</p>\n<p>Hotovo; te&#x10F; je na autorech projektu, aby se na zm&#x11B;ny pod&#xED;vali a p&#x159;ijali &#x2012; nebo za&#x10D;ali diskusi o tom, jak ji je&#x161;t&#x11B; vylep&#x161;it.\n(Diskutovat se d&#xE1; na str&#xE1;nce pull requestu nebo p&#x159;es mail.)</p>\n<div class=\"admonition note\"><p class=\"admonition-title\">Pozn&#xE1;mka</p>\n<p>Proch&#xE1;z&#xED;te-li materi&#xE1;ly z domu, mus&#xED;te po&#x10D;kat, ne&#x17E; si n&#x11B;kdo &#x17E;&#xE1;dosti v&#x161;imne a za&#x10D;len&#xED; ji.\nTo m&#x16F;&#x17E;e trvat i p&#xE1;r dn&#xED;; kdyby to bylo p&#x159;es t&#xFD;den, tak se zkuste se ozvat znovu.</p>\n</div><h3>Aktualizace (<code>git pull</code>)</h3>\n<p>Kdy&#x17E; budou zm&#x11B;ny od v&#x161;ech &#xFA;&#x10D;astn&#xED;k&#x16F; za&#x10D;len&#x11B;n&#xE9;, m&#x16F;&#x17E;eme si aktualizovat repozit&#xE1;&#x159;, kter&#xFD; m&#xE1;me u sebe na po&#x10D;&#xED;ta&#x10D;i. P&#x159;&#xED;kaz</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>git pull origin master\n</pre></div><p>st&#xE1;hne zm&#x11B;ny z v&#x11B;tve &#x201E;master&#x201D; z adresy pod zkratkou &#x201E;origin&#x201D;.\nPomoc&#xED; <code>git log</code> se m&#x16F;&#x17E;eme pod&#xED;vat, jak se projekt mezit&#xED;m vyvinul.</p>\n<p>Kruh se uzav&#x159;el, jsme schopni za&#x10D;lenit do projektu vlastn&#xED; zm&#x11B;ny a naopak si st&#xE1;hnout zm&#x11B;ny od ostatn&#xED;ch. \nA&#x17E; p&#x159;&#xED;&#x161;t&#x11B; uvid&#xED;te chyby v materi&#xE1;lech nebo ne&#x161;ikovnou formulaci, zkuste to opravit a ud&#x11B;lat pull request.</p>\n<p>Git je velk&#xE9; t&#xE9;ma a mohli bychom prob&#xED;rat v&#x11B;tven&#xED; nebo &#x159;e&#x161;en&#xED; konflikt&#x16F; a spoustu dal&#x161;&#xED;ho,\nale nechme si to na pokra&#x10D;ovac&#xED; srazy nebo workshop.</p>\n\n\n        "
    }
  }
}