Vzdálené repozitáře

Vzdálený repozitář si opatříme příkazem clone:

$ git clone https://github.com/geosense/git.git

Nebo v existujícím repozitáři si ho můžeme přidat příkazem remote:

$ git remote add madlenkk https://github.com/madlenkk/git.git

Protože kolegové nikdy nespí, je potřeba často a pravidelně stahovat změny z repozitáře. Jako nejlepší praktika se nám osvědčil systém git fetch - git rebase.

Poznámka

Často se v návodech objevuje postup git pull –rebase, ten má ale tu nevýhodu, že v jednom kroku musíte řešit případné konflikty mezi verzí na server a verzí ve vašem lokálním repozitáři. git fetch vám pouze stáhne změny ze serveru, ale nechá vas pracovat tam “kde zrovna jste”. git rebase vám pak pomůže při “posunu nad” aktuální konec větve ze serveru.

Stánutí všech revizí ze všech serverů:

$ git fetch --all
Fetching origin
Fetching madlenkk
From https://github.com/madlenkk/git
 * [new branch]      master     -> madlenkk/master

git tree ukáže, kde jsem:

$ git tree

*   6ebd5ea (HEAD -> master) Merge branch 'pokusna_vetev'
|\
| * 2e03719 (pokusna_vetev) commit do jine vetve
* | 096304c vyroba konfliktniho řádečku
|/
* b89a5c0 pokracovani dokumentace
* 1a99084 Doplnění sekce práce s gitem
* bc12c5d last note
*   6574bcf (origin/master) Merge pull request #1 from madlenkk/master
|\
| * 83221c8 (madlenkk/master) Opravy překlepů
|/
* 7c75607 neco o gitu
* c9aa4cf pridavam README
* a7440f4 initial commit

Vidíte, že magdalenina větev master je o revizi za serverem origin a ten je zase o nutný kus historie za mou lokální větví.

push a pull (vlastně fetch)

Pro práci se vzdálenými serveri slouží dva základní příkazy git push a git pull. Nám se ale osvědčilo používat místo pull kombinaci fetch a rebase.

Rozdíl mezi fetch a pull je, že `git pull` udělá v jednom kroce `git fetch` následovaný `git merge`. pull vás dounutí okamžitě řešit konflikty mezi lokální a vzdálenou větví.

git fetch vám dovolí pouze stáhnout nové revize ze vzdáleného serveru. git rebase vám umožní se se svými lokálními commity posunout nad revize stažené ze serveru.

Pokud chci poslat změny na vzdálený server, je to už jednoduché, použiji git push.

Takže nejpre stáhneme změny ze vech vzdálených repozitářů:

$ git fetch --all

Podíváme se, kde je kdo, kde je jaká větev:

$ git tree

*   6ebd5ea (HEAD -> master) Merge branch 'pokusna_vetev'
|\
| * 2e03719 (pokusna_vetev) commit do jine vetve
* | 096304c vyroba konfliktniho řádečku
|/
* b89a5c0 pokracovani dokumentace
* 1a99084 Doplnění sekce práce s gitem
* bc12c5d last note
*   6574bcf (origin/master) Merge pull request #1 from madlenkk/master
|\
| * 83221c8 (madlenkk/master) Opravy překlepů
|/
* 7c75607 neco o gitu

Vidíme, že jsme daleko před verzí v repozitáři origin in madlankk. Konflikty nevidět, mohu vesele poslat svoje lokální revize na server origin:

$ git push origin
Username for 'https://github.com': jachym
Password for 'https://jachym@github.com':
Counting objects: 25, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (25/25), 120.36 KiB | 0 bytes/s, done.
Total 25 (delta 14), reused 0 (delta 0)
remote: Resolving deltas: 100% (14/14), completed with 3 local objects.
To https://github.com/geosense/git.git
   6574bcf..6ebd5ea  master -> master
jachym@krovak:~/.../cleerio/skoleni/git (master)$

A zkontrolovat, jak se věci mají pomocí git tree:

$ git tree
*   6ebd5ea (HEAD -> master, origin/master) Merge branch 'pokusna_vetev'
...

Vidíte, že větve master a origin/master jsou již v souladu.

Nyní přijde ale do práce madlenkka a co nevidí - origin jí “ujel” o pěkných pár commitů. Co jí zbývá, než stáhnout změny ze serveru:

$ git fetch --all

Posunout svoji aktuální práci nad verzi na serveru:

$ git rebase origin/master