-
1. Úvod
- 1.1 Správa verzí
- 1.2 Stručná historie systému Git
- 1.3 Základy systému Git
- 1.4 Příkazový řádek
- 1.5 Instalace systému Git
- 1.6 První nastavení systému Git
- 1.7 Získání nápovědy
- 1.8 Shrnutí
-
2. Základy práce se systémem Git
-
3. Větve v systému Git
- 3.1 Větve v kostce
- 3.2 Základy větvení a slučování
- 3.3 Správa větví
- 3.4 Postupy při práci s větvemi
- 3.5 Vzdálené větve
- 3.6 Přeskládání
- 3.7 Shrnutí
-
4. Git na serveru
- 4.1 Protokoly
- 4.2 Zprovoznění Gitu na serveru
- 4.3 Generování veřejného klíče SSH
- 4.4 Nastavení serveru
- 4.5 Démon Git
- 4.6 Chytrý HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Možnosti hostování u třetí strany
- 4.10 Shrnutí
-
5. Distribuovaný Git
- 5.1 Distribuované pracovní postupy
- 5.2 Přispívání do projektu
- 5.3 Správa projektu
- 5.4 Shrnutí
-
6. GitHub
-
7. Git Tools
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Ladění v systému Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Shrnutí
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Atributy Git
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Shrnutí
-
9. Git a ostatní systémy
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Shrnutí
-
10. Git Internals
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Balíčkové soubory
- 10.5 The Refspec
- 10.6 Přenosové protokoly
- 10.7 Správa a obnova dat
- 10.8 Environment Variables
- 10.9 Shrnutí
-
A1. Appendix A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Shrnutí
-
A2. Appendix B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
5.1 Distribuovaný Git - Distribuované pracovní postupy
Máte vytvořen vzdálený gitový repozitář, který je nastaven tak, aby mohli všichni vývojáři sdílet svůj zdrojový kód, a znáte základní příkazy Gitu pro práci v lokálním prostředí. Nastal čas, abychom se podívali na využití některých distribuovaných pracovních postupů, které vám Git nabízí.
V této kapitole uvidíte, jak se v distribuovaném prostředí s Gitem pracuje v roli přispěvatele a v roli integrátora. Jinými slovy, naučíte se, jak lze do projektu úspěšně přidat vlastní kód, jak to co nejvíc usnadnit sobě i správci projektu a také to, jak se dá úspěšně udržovat projekt, do kterého přispívá velký počet vývojářů.
Distribuované pracovní postupy
Na rozdíl od centralizovaných systémů pro správu verzí, distribuovaný charakter systému Git umožňuje vývojářům mnohem větší pružnost ve způsobech spolupráce na projektech. V centralizovaných systémech představuje každý vývojář samostatný uzel, pracující s centrálním úložištěm více či méně na stejné úrovni. Naproti tomu v Gitu je každý vývojář potenciálním uzlem i úložištěm. To znamená, že každý vývojář může přispívat kódem do ostatních repozitářů a současně může spravovat veřejný repozitář, z kterého mohou ostatní vycházet při své práci a do kterého mohou přispívat. Tím se pro váš projekt a váš tým otvírá široké spektrum pracovních postupů. Podíváme se na pár obvyklých přístupů, které dané pružnosti využívají. Uvedeme si jejich přednosti i eventuální slabiny. Můžete vybrat jeden z nich, nebo je můžete pro dosažení požadovaných vlastností navzájem kombinovat.
Centralizovaný pracovní postup
V centralizovaných systémech je většinou možný pouze jediný model, tzv. centralizovaný pracovní postup. Jedno centrální úložiště (hub) nebo repozitář přijímá zdrojový kód a každý podle něj synchronizuje svou práci. Několik vývojářů představuje uzly — konzumenty centrálního úložiště --, které se synchronizují se podle tohoto místa.
To znamená, že pokud dva vývojáři klonují z centrálního úložiště a oba provedou změny, pak jen první z nich může bez problémů odeslat (push) své změny zpět. Druhý vývojář musí před odesláním svých změn začlenit (merge) práci prvního vývojáře do své, aby nepřepsal jeho změny. Tento koncept platí jak pro Git, tak pro Subversion (nebo pro jiný systém pro správu verzí). Bez problémů funguje i v Gitu.
Pokud už jste ve své firmě nebo v týmu na centralizovaný pracovní postup zvyklí, můžete v něm snadno pokračovat i při použití Gitu. Jednoduše vytvořte repozitář a přidělte všem ze svého týmu oprávnění k odesílání dat. Git uživatelům neumožní, aby se navzájem přepisovali. Dejme tomu, že John i Jessica začnou pracovat ve stejném čase. John dokončí své úpravy a odešle je na server. Poté se Jessica pokusí odeslat své změny, ale server je odmítne. Řekne jí, že se pokouší odeslat změny (push), které nemají charakter „rychle vpřed“, a že to nebude moci udělat, dokud neprovede vyzvednutí a sloučení (fetch a merge). Tento pracovní postup je pro mnoho lidí zajímavý, protože je to model, který jsou zvyklí používat a jsou s ním spokojeni.
A není také omezen jen na malé týmy. Model větvení Gitu umožňuje, aby na jednom projektu pracovaly stovky vývojářů a využívali při tom souběžně desítky větví.
Pracovní postup s integračním manažerem
Protože Git umožňuje práci s více vzdálenými repozitáři, lze využít pracovní postup, kdy má každý vývojář přiděleno právo zápisu do svého vlastního veřejného repozitáře a oprávnění pro čtení k repozitářům všech ostatních. Tento scénář často zahrnuje jeden hlavní repozitář, který reprezentuje „oficiální“ projekt. Chcete-li do tohoto projektu přispívat, vytvoříte vlastní veřejný klon projektu a odešlete do něj změny, které jste provedli. Poté můžete správci hlavního projektu odeslat žádost, aby do projektu vaše změny vtáhl (pull). Správce si pak může váš repozitář přidat jako vzdálený, lokálně otestovat vaše změny, začlenit (merge) je do své větve a odeslat zpět (push) do svého repozitáře. Proces funguje následovně (viz obrázek Pracovní postup s integračním manažerem.):
-
Správce projektu odešle data do svého veřejného repozitáře.
-
Přispěvatel naklonuje tento repozitář a provede změny.
-
Přispěvatel odešle změny do své vlastní veřejné kopie.
-
Přispěvatel pošle správci email, ve kterém jej požádá o vtažení změn (pull).
-
Správce si přidá přispěvatelův repozitář jako vzdálený a provede lokální sloučení (merge).
-
Správce odešle začleněné změny do hlavního repozitáře.
Tento pracovní postup je velmi běžný, pokud se pracuje centralizačními nástroji[15] jako je GitHub nebo GitLab. Projekt se zde dá snadno odštěpit a změny se pak odesílají do vlastní, odštěpené části, kde se na ně může každý podívat. Jednou z hlavních výhod tohoto přístupu je, že můžete pracovat bez přerušení a správce hlavního repozitáře může vaše změny do projektu vtáhnout (pull in) až to uzná za vhodné. Přispěvatelé nemusí čekat, až budou jejich změny začleněny do projektu — všichni zúčastnění mohou pracovat svým vlastním tempem.
Pracovní postup s diktátorem a poručíky
Jedná se o variantu pracovního postupu s více repozitáři. Většinou se používá u obřích projektů se stovkami spolupracovníků. Možná nejznámějším příkladem je vývoj jádra Linuxu. Za konkrétní části repozitáře odpovídají různí integrační manažeři. Říká se jim poručíci (lieutenants). Všichni poručíci mají jednoho integračního manažera, kterému se říká benevolentní diktátor. Repozitář benevolentního diktátora slouží jako referenční repozitář, z nějž všichni spolupracovníci musí stahovat data. Proces funguje nějak takto (viz obrázek Pracovní postup s benevolentním diktátorem.):
-
Stálí vývojáři pracují na svých tématických větvích a přeskládávají (rebase) svou práci na vrchol větve
master
. Větevmaster
je předmětem zájmu diktátora. -
Poručíci začleňují (merge) tématické větve vývojářů do svých větví
master
. -
Diktátor začleňuje větve
master
poručíků do své větvemaster
. -
Diktátor odesílá svou větev
master
do referenčního repozitáře, aby ji ostatní vývojáři mohli použít jako základ pro přeskládání (rebase).
Tento typ pracovního postupu sice není běžný, ale může být užitečný u velmi velkých projektů nebo v přísně hierarchických prostředích. Umožňuje vedoucímu projektu (diktátorovi) velkou část práce delegovat a poté na více místech sesbírat velké podmnožiny kódu, které pak dává dohromady.
Shrnutí pracovních postupů
Toto jsou tedy některé z běžně používaných pracovních postupů, které umožňují distribuované systémy, jako je Git. Ale sami vidíte, že lze uplatnit řadu variací, aby to vyhovovalo vašim konkrétně používaným pracovním postupům. Teď už si (snad) dokážete vybrat, jaká kombinace by vám mohla vyhovovat. Ukážeme si pár konkrétnějších příkladů toho, jak splnit hlavní role, které různé pracovní postupy vytvářejí. V následující podkapitole se dozvíte o několika obvyklých způsobech přispívání do projektu.