6. díl - Git - Práce se vzdáleným repositářem

Software Git Git - Práce se vzdáleným repositářem

V minulém díle jsme si pověděli o práci s větvemi. Zatím ale vše probíhalo lokálně a tedy jen u nás v počítači. Dnes se podělíme i s ostatními. Řekneme si něco o práci se vzdáleným repositářem, jak aktualizovat lokální repositář nebo jak naopak nahrát změny na repositář vzdálený.

Jak vytvořit vzdálený repositář

Pokud chceme vytvořit veřejný repositář, musíme mít nejprve kde ho umístit. Tady bych se vrátil k prvnímu dílu, kde jsme si vyjmenovali jednotlivé servery, které poskytují repositáře. Pro další práci budou ukázky z GitHubu.

Vytvoření repositáře

Před vytvořením musíme repositář pojmenovat. Dále je možnost přidat k repositáři popis a nastavit, zda bude veřejný nebo privátní (popsáno v prvním dílu). V poslední kolonce můžeme zvolit, jestli se vytvoří repositář s README souborem. Jeho text bude zobrazován na úvodní stránce repositáře a mělo by v něm být uvedeno o jaký projekt se jedná. Dále může GitHub automaticky vytvořit .gitignore soubor pro zadaný jazyk a také LICENCE soubor, ve kterém je jen napsáno jestli a jakým způsobem se může dílo dále šířit. Poté můžeme odkliknout vytvoření repositáře. Pro jeho stažení využijeme již známý příkaz git clone.

HTTPS nebo SSH

Pro připojení k repositáři můžeme využít HTTPS nebo pouze SSH. Nejprve se podíváme na složitější konfiguraci SSH a poté na HTTPS.

Abychom se mohli připojit přes SSH, musíme si vygenerovat SSH klíč, podle kterého nás server pozná. Kompletní návod je na stránkách GitHubu.

$ ssh-keygen -t rsa -b 4096 -C "vas_mail@priklad.cz"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/VasUcet/.ssh/id_rsa): [Povrdíme Enterem]
Enter passphrase (empty for no passphrase): [Napíšeme heslo]
Enter same passphrase again: [Znovu napíšem heslo]
Your identification has been saved in /c/Users/ VasUcet /.ssh/id_rsa.
Your public key has been saved in /c/Users/ VasUcet /.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db vas_mail@priklad.cz

Nyní máme vygenerovaný SSH klíč, který najdeme v souboru C:\Users\VasU­cet\.ssh\id_rsa­.pub. Následně jej přidáme na GitHub. V nastavení účtu najdeme položku SSH keys. Odlikneme tlačítko „Add SSH Key“. Klíč nějakým způsobem pojmenujeme a vložíme stejný obsah, jako je v souboru id_rsa.pub (bez jakýchkoliv úprav!). Uložíme a můžeme začít používat.

Vložení klíče

Pro ověření funkčnosti zavoláme příkaz ssh –T git@github.com. Nevýhodou je, že při každém dotazu na server musíme zadat heslo.

Pokud budeme používat HTTPS, bude potřeba zadávat kromě hesla (tentokrát k účtu) také email. Tomu se můžeme vyhnout příkazem git config --global credential.helper cache. Poté se bude cachovat heslo 15 minut. Pokud chceme cachovat heslo déle, použijeme atribut --timeout git config --global credential.helper "cache --timeout=3600". Čas se zadává v sekundách (v příkladu je tedy nastavena jedna hodina).

Který způsob tedy použít? GitHub doporučuje HTTPS. Neblokuje jej firewall a je kompatibilní. Z hlediska správy je velmi lákavý pro veřejnost, protože stačí pouze jméno a příjmení. Naproti tomu má SSH snadnější konfiguraci na straně serveru, ovšem uživatel musí generovat vlastní klíč. Z toho také plyne, že není možné přes SSH poskytovat anonymní přístup (i kdyby jen read-only). SSH je bezpečnější a při ztrátě nebo odcizení klíče je snadné smazat klíč z účtu. Co tedy využijete závisí na aktuálních potřebách.

Odkazy na vzdálené repositáře a větve

Abychom se mohli připojit na vzdálený repositář z lokálního, musí k němu existovat odkaz. Seznam odkazů na vzdálené repositáře Git uchovává pod příkazem git remote. Bez parametrů zobrazí seznam všech odkazů. Pokud jste repositář naklonovali, bude tam již jeden odkaz s názvem origin. Jedná se o odkaz na zdroj, ze kterého repositář pochází. Těchto odkazů si můžeme vytvořit libovolné množství. Příkazem git remote add <NazevZdroje> <url> vytvoříte nový, naopak příkazem git remote remove <zdroj> odkaz smažete. Více informací najdete na oficiálních stránkách.

Na serveru může existovat více větví, zároveň může někdo větev, ze které jste klonovali, upravit před tím, než do ní zapíšete vlastní změny. K větvím na serveru přistupujeme přes odkaz. Pokud chceme získat seznam větví na serveru, využijeme příkaz git remote show <zdroj>.

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:PatrikValkovic/Test.git
  Push  URL: git@github.com:PatrikValkovic/Test.git
  HEAD branch: master
  Remote branches:
    NovaVetev  new (next fetch will store in remotes/origin)
    TretiVetev new (next fetch will store in remotes/origin)
    master     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)

Pod „Remote branches“ vidíme seznam vzdálených větví. Tyto větve jsou nezávislé na lokálním repositáři (právě kvůli změnám, které může udělat kdokoliv). Musíme se k nim tedy odkazovat jiným způsobem. Pro vzdálené větve napíšeme před její název jméno odkazu a lomítko. Chceme-li tedy přistoupit na větev TretiVetev ze zdroje origin použijeme příkaz git checkout origin/TretiVetev. Z toho také plyne, že můžeme mít několik zdrojů, které vycházejí z jednoho repositáře. Situace poté bude vypadat tak, že budeme mít větev master, ve které právě pracujeme, větev PuvodniReposi­tar/master, větev PrvniZdroj/Master a větev TretiZdroj/master. Tyto větve jsou na sebe nezávislé a můžeme s nimi pracovat odděleně (aniž by nastával problém duplicitních názvů).

Aktualizace ze vzdáleného repositáře

Zatím jsme zjistili, jaké větve jsou na serveru uloženy, ale nemáme k nim přístup. Abychom jej měli, musíme aktualizovat větve zdroje. To provedeme příkazem git fetch <zdroj>. Ten postahuje všechny změny ze vzdáleného repositáře a uloží je lokálně. Tyto větve ovšem budou stále spojeny se zdrojem (zdroj/vetev). Co ale můžeme, je pracovat s nimi jako normálními větvemi – a tedy je i mergovat. Toho využijeme. Vytvoříme si novou větev a zmergujeme ji s větví, která byla na serveru. Tím máme stejnou podobu větve, jaká je na serveru. Vytváření a mergování můžeme urychlit příkazem git checkout <NazevVzdalene­Vetve> (tedy máme-li větev origin/NovaVetev, potom git checkout NovaVetev vytvoří novou větev a automaticky ji zmerguje) . Tím se vytvoří nová větev se stejný názvem a zmerguje se s původní větví.

Ještě většího urychlení docílíme příkazem git pull, který nahradí příkazy git fetch a git merge. git pull provede oba příkazy za nás. Neprovádí to ale pro všechny větve, pouze pro nakonfigurované. Seznam větví, které se budou automaticky aktualizovat příkazem git pull, je vypsán v popisu zdroje pod bodem „Local branch configured for 'git pull'“. V základním nastavení zde bude master větev a všechny větve, které se vytvořily automaticky příkazem git checkout se jménem vzdálené větve. Větev můžeme přidat i ručně příkazem git branch --set-upstream-to <zdroj>/<Jmeno­VetveKamPosilat>. Od této doby se bude aktuální lokální větev automaticky aktualizovat podle vzdálené větve, kterou jsme určili. Na přehledu zdroje by se větev měla zobrazit jako nakonfigurovaná pro 'git pull'. Pokud použijeme pouze git pull, aktualizuje se podle zdroje „origin“. Pokud budeme chtít aktualizovat podle jiného zdroje, musíme ho uvést (git pull <zdroj>).

Aktualizujeme vzdálený repositář

Pro opačný směr, tedy aktualizaci vzdáleného repositáře, nám bude stačit jediný příkaz, a to git push. Ukážeme si jeho nejvíce používané tři podoby. Pro více informací použijte dokumentaci. Vzhledem k velkému počtu přepínačů nebudu rozebírat každý případ.

První případ je git push <zdroj> <vetev>. Tento příkaz pošle zadanou větev na server. Pokud na serveru větev se zadaným jménem existuje, tak ji aktualizuje, jinak novou větev vytvoří. Pokud chceme poslat větev, která má na serveru jiné jméno (nebo se jména neshodují), použijeme příkaz git push <zdroj> <LokalniVetev>:<Ve­tevNaServeru>.

Obdobně jako u git pull můžeme zavolat git push bez parametrů nebo jen s parametrem zdroje. Pokud nebudou uvedeny žádné parametry, automaticky se pošlou změny na zdroj „origin“. Větve, které se budou odesílat, jsou nakonfigurovány u daného zdroje (Local ref configured for 'git push'). Opět se tam bude vyskytovat větev master a všechny větve, které jsme automaticky vytvořili příkazem git checkout. Pro ruční přidání větve do tohoto seznamu jsem příkaz nenašel. Pokud by bylo potřeba takovou funkcionalitu zprovoznit (dostávat data z jiného repositáře, než na který data posíláte), doporučuji nastudovat proměnnou branch.<name>­.pushRemote v configu. Je ale nutné si uvědomit, že větev musí být aktualizovaná, jinak server nepovolí nahrání souborů. Proto je vhodné zařadit větve v push i do pull.

Řešení kolizí

Může se stát, že zatímco pracujete na části kódu, někdo jiný nahraje svou část kódu. V této chvíli odkazuje váše větev master někam jinam než origin/master. Git zavádí pro kolize striktní politiku – nahrání souborů selže. Musíte si stáhnout aktuální podobu na serveru. Pokud tedy nastanou kolize, musíte je vyřešit vy, protože při stahování vzdálených větví dojde na mergování. K nahrání souborů vás Git pustí, až když bude vaše větev master aktuální (up to date).

Tím je seriál o Gitu u konce. Pro další pokročilejší studium si můžete stáhnout knihu „Pro Git“ nebo prostudovat dokumentaci. Doufám, že jsem Vám ukázal dostatek kladů, které Git přináší a nebudete pochybovat o jeho použití v dalším projektu :-).


 

  Aktivity (1)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Celkem (5 hlasů) :
55555


 


Miniatura
Předchozí článek
Git - Rozděluj a panuj
Miniatura
Všechny články v sekci
Git

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!