Git
Chapters ▾ 2nd Edition

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