-
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
2.5 Základy práce se systémem Git - Práce se vzdálenými repozitáři
Práce se vzdálenými repozitáři
Abyste mohli na gitových projektech spolupracovat, je třeba vědět, jak manipulovat se vzdálenými repozitáři (remote repositories). Vzdálené repozitáře jsou verze vašeho projektu umístěné na Internetu nebo kdekoli v síti. Vzdálených repozitářů můžete mít několik, každý pro vás bude přístupný buď pouze pro čtení (read-only) nebo pro čtení i zápis (read/write). Spolupráce s ostatními uživateli zahrnuje správu těchto vzdálených repozitářů a odesílání (push) a stahování dat (pull) v okamžicích kdy chcete práci sdílet. Při správě vzdálených repozitářů musíte vědět, jak lze přidat vzdálený repozitář, jak odstranit vzdálený repozitář, který už není platný, jak spravovat různé vzdálené větve, jak je určit jako sledované či nesledované a další věci. V této podkapitole se budeme zabývat některými z těchto dovedností.
Zobrazení vzdálených serverů
Chcete-li zjistit, jaké vzdálené servery jste si nakonfigurovali, můžete použít příkaz git remote
.
Zobrazí se seznam krátkých jmen, která jste vzdáleným repozitářům přidělili.
Pokud jste repozitář vytvořili klonováním, měli byste v něm vidět přinejmenším origin
— jako výchozí název ho Git přidělí serveru, ze kterého jste vytvářeli klon:
$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin
Můžete také přidat -v
, což vede k zobrazení adresy URL, kterou Git pro zkrácené jméno uložil a která se používá při čtení z a při zápisu na tento vzdálený server:
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
Pokud používáte více než jeden vzdálený repozitář, příkaz je vypíše všechny. Repozitář s více vzdálenými servery, který slouží pro spolupráci s více lidmi, může vypadat například takto.
$ cd grit
$ git remote -v
bakkdoor https://github.com/bakkdoor/grit (fetch)
bakkdoor https://github.com/bakkdoor/grit (push)
cho45 https://github.com/cho45/grit (fetch)
cho45 https://github.com/cho45/grit (push)
defunkt https://github.com/defunkt/grit (fetch)
defunkt https://github.com/defunkt/grit (push)
koke git://github.com/koke/grit.git (fetch)
koke git://github.com/koke/grit.git (push)
origin git@github.com:mojombo/grit.git (fetch)
origin git@github.com:mojombo/grit.git (push)
To znamená, že můžeme celkem snadno stáhnout příspěvky od kteréhokoli z těchto uživatelů. Na jeden nebo několik z nich můžeme mít navíc přiděleno právo pro odesílání změn (push), ale z tohoto výpisu to nelze poznat.
Všimněte si, že tyto vzdálené repozitáře používají různé protokoly. Více se o tom zmíníme v kapitole Zprovoznění Gitu na serveru.
Přidávání vzdálených repozitářů
Už jsme se zmínili a trochu jsme si ukázali, že příkaz clone automaticky přidá vzdálený repozitář origin
za vás.
Teď si ukážeme, jak můžeme přidat nový vzdálený repozitář explicitně.
Chcete-li přidat nový vzdálený gitový repozitář a zadat zkrácený název, přes který se můžete snadno odkazovat, spusťte příkaz git remote add <zkrácený název> <url>
:
$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
Řetězec pb
nyní můžete používat na příkazovém řádku místo kompletní adresy URL.
Pokud například chcete vyzvednout (fetch) všechny informace, které má Paul, ale vy je ještě nemáte ve svém repozitáři, můžete provést příkaz git fetch pb
:
$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit
Paulova hlavní větev je teď lokálně dostupná jako pb/master
. Můžete ji začlenit (merge) do některé ze svých větví, nebo ji můžete zpřístupnit jako lokální větev (check out), jestliže si ji chcete prohlédnout.
(Podrobněji se budeme větvím a jejich použití věnovat v kapitole Větve v systému Git.)
Vyzvedávání a stahování ze vzdálených repozitářů
Jak jste právě viděli, můžete pro získání dat vzdáleného projektu použít příkaz:
$ git fetch [jméno-vzdáleného-repozitáře]
Příkaz zamíří do vzdáleného projektu a stáhne z něj všechna data, která ještě nemáte u sebe. Poté byste měli mít k dispozici odkazy na všechny větve tohoto vzdáleného projektu. Od toho okamžiku je můžete kdykoli slučovat (merge) nebo prohlížet.
Pokud vytvoříte klon nějakého repozitáře, příkaz automaticky přidá tento vzdálený repozitář pod názvem origin
.
Takže příkaz git fetch origin
vyzvedne veškerou novou práci, která byla na uvedený server poslána (push) od okamžiku, kdy jste odtud klonovali (nebo kdy jste odtud naposledy vyzvedávali práci).
Měli bychom zmínit, že příkaz git fetch
jen stáhne data do vašeho lokálního repozitáře. Neprovede ale automatické sloučení (merge) s vaší prací, ani nezmění nic z toho, na čem právě pracujete.
Sloučení s vaší prací musíte udělat ručně, až to uznáte za vhodné.
Pokud má vaše aktuální větev nastaveno sledování vzdálené větve (více informací naleznete v následující podkapitole a v kapitole Větve v systému Git), můžete použít příkaz git pull
, který automaticky vyzvedne (fetch) a poté začlení (merge) vzdálenou větev do vaší aktuální větve.
Tento postup pro vás může být snazší a pohodlnější. Standardně přitom příkaz git clone
automaticky nastaví vaši lokální větev master
tak, aby sledovala vzdálenou větev master
(výchozí větev může být i jiná) na serveru, z kterého jste klonovali.
Příkaz git pull
většinou vyzvedne (fetch) data ze serveru, z něhož jste původně klonovali, a automaticky se pokusí začlenit je (merge) do kódu, na němž právě pracujete.
Odesílání do vzdálených repozitářů
Pokud se váš projekt nachází ve stavu, kdy ho chcete sdílet s ostatními, můžete ho odeslat (push) na referenční server (upstream[9]).
Příslušný příkaz je jednoduchý: git push [jméno-vzdáleného-serveru] [jméno-větve]
.
Pokud chcete na server origin
odeslat svou větev master
(znovu připomeňme, že při klonování se vám obě tato jména nastaví automaticky), pak následující příkaz odešle na server všechny vaše revize (commits):
$ git push origin master
Tento příkaz bude funkční, pouze pokud jste klonovali ze serveru, k němuž máte oprávnění pro zápis, a pokud tam mezi tím nikdo nic neodeslal. Pokud ve stejnou dobu obsah naklonuje ještě někdo jiný a svou práci odešle na společný server (upstream), vaše později odesílaná práce bude oprávněně odmítnuta. Nejdříve musíte jeho práci vyzvednout (fetch), zahrnout ji do vaší a teprve potom budete moci vše odeslat. Více informací o odesílání na vzdálené servery najdete v kapitole Větve v systému Git.
Prohlížení vzdálených repozitářů
Jestliže chcete získat více informací o konkrétním vzdáleném repozitáři, můžete použít příkaz git remote show [název-vzdáleného-repozitáře]
.
Pokud použijete tento příkaz v kombinaci s konkrétním zkráceným názvem (např. origin
), bude výstup vypadat zhruba následovně:
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Bude obsahovat adresu URL vzdáleného repozitáře a informace o sledovaných větvích.
Příkaz vám mimo jiné sděluje, že pokud se nacházíte na větvi master
a spustíte příkaz git pull
, pak se po vyzvednutí všech vzdálených referencí (fetch) větev master
ze vzdáleného serveru automaticky začlení (merge).
Součástí výpisu jsou také všechny vzdálené reference, které příkaz stáhl.
S uvedeným jednoduchým případem se pravděpodobně setkáte.
Pokud však Git používáte intenzivněji, může vám příkaz git remote show
zobrazit mnohem více informací:
$ git remote show origin
* remote origin
URL: https://github.com/my-org/complex-project
Fetch URL: https://github.com/my-org/complex-project
Push URL: https://github.com/my-org/complex-project
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
markdown-strip tracked
issue-43 new (next fetch will store in remotes/origin)
issue-45 new (next fetch will store in remotes/origin)
refs/remotes/origin/issue-11 stale (use 'git remote prune' to remove)
Local branches configured for 'git pull':
dev-branch merges with remote dev-branch
master merges with remote master
Local refs configured for 'git push':
dev-branch pushes to dev-branch (up to date)
markdown-strip pushes to markdown-strip (up to date)
master pushes to master (up to date)
Tento příkaz ukazuje, která větev bude automaticky odeslána, pokud spustíte příkaz git push
na určitých větvích.
Příkaz vám také ukáže, které vzdálené větve na serveru ještě nemáte, které vzdálené větve máte, ale ze serveru už byly odstraněny, a několik lokálních větví, které budou automaticky začleněny (merge), když spustíte příkaz git pull
.
Odstraňování a přejmenovávání vzdálených repozitářů
Pokud chcete zkrácené jméno vzdáleného repozitáře změnit, můžete provést příkaz git remote rename
.
Pokud například chcete přejmenovat pb
na paul
, můžete tak učinit následujícím příkazem git remote rename
:
$ git remote rename pb paul
$ git remote
origin
paul
Za zmínku stojí, že tím změníte také názvy vzdáleně sledovaných větví.
Z původní reference pb/master
se tak nyní stává paul/master
.
Chcete-li z nějakého důvodu odstranit referenci (přesunuli jste například server nebo už nepoužíváte dané zrcadlo, nebo třeba přispěvatel přestal přispívat), můžete využít příkaz git remote rm
:
$ git remote rm paul
$ git remote
origin
upstream
používá i pro pojmenování takového vzdáleného serveru. Typicky jde o server, který slouží ke sdílení výsledků projektu, který se považuje v jistém smyslu za referenční — z něj to teče dolů po proudu k ostatním. Je možné, že se s tímto pojmem poprvé setkáte v okamžiku, kdy začnete používat GitHub a provedete takzvaný Fork jiného projektu. V nápovědě přímo najdete příkazy, ve který se slovo upstream vyskytuje — GitHub Help: Fork a Repo. V této souvislosti chápejte pojmy vzdálený server a vzdálený repozitář jako shodné. Repozitář označovaný pojmem upstream je ten, ze kterého jste na GitHub provedli fork.