]> rtime.felk.cvut.cz Git - edu/osp-wiki.git/blobdiff - cviceni/4.mdwn
Updates/fixes
[edu/osp-wiki.git] / cviceni / 4.mdwn
index a77f3c27e2b804404a95079c06dc19c162575991..8cb86b4141b979ce3a8ab62138091cd66a44aa1c 100644 (file)
@@ -12,25 +12,26 @@ Konkrétně nás bude zajímat:
 * využití Gitu pro distribuovaný vývojový model, který je praktikován
   mnoha open source projekty,
 * efektivní prohledávání historie projektu, které je užitečné
-  například při rozhodování, jak správně vyřešit určitý konflikt.
+  například při rozhodování, jak správně vyřešit určitý konflikt a
+* řešení konfliktů.
 
 [git]:http://git-scm.com/
 
 Úvod
 ====
 
-Git je velmi univerzální nástroj pro správu a synchronizaci dat
-v souborech. Kromě verzování softwaru ho lidé používají
-k [mnoha dalším činnostem][gitsurvey-usedfor]. Jedna z často
-zmiňovaných nevýhod Gitu je, že oproti jiným verzovacím systémům je
-těžší se ho naučit a používat. Možným důvodem je to, že git nabízí
-větší funkcionalitu než většina ostatních systémů, která se ale
-využije jen ve speciálních případech – například jen u extrémně
+Git je poměrně univerzální nástroj pro správu a synchronizaci dat
+v souborech. Kromě verzování softwaru ho lidé používají k mnoha dalším
+činnostem (viz [Git User's Survey 2012, otázka 8][gitsurvey]). Jedna
+z často zmiňovaných nevýhod Gitu je, že oproti jiným verzovacím
+systémům je těžší se ho naučit a používat. Možným důvodem je to, že
+git nabízí větší funkcionalitu než většina ostatních systémů, která se
+ale využije jen ve speciálních případech – například jen u extrémně
 velkých projektů jako Linuxové jádro. Ať už to tak je, nebo ne, faktem
 je, že Git se neustále vyvíjí a mnoho úsilí je věnováno právě zlepšení
 uživatelské přivětivosti.
 
-[gitsurvey-usedfor]:http://www.survs.com/app/7/wo/GffJpx48NlVaG9rZZGKsI0/0.0.0.7.7.3.3.1.1.5.1.1.1.9.1
+[gitsurvey]:https://www.survs.com/results/QPESOB10/ME8UTHXM4M
 
 Pro pochopení Gitu je důležité mít základní představu o tom, jak Git
 pracuje s větvemi, což bylo popsáno v [[přednášce|prednasky/intro-to-git.pdf]]
@@ -48,7 +49,8 @@ pomocí grafických nástrojů:
 
 * Příkaz `git gui` je grafický nástroj částečně nahrazující příkazy
   `git status` a `git commit`. Pomocí menu je možné provádět i další
-  operace jako např. vytváření větví a práce se vzdálenými repozitáři.
+  operace jako např. vytváření větví nebo pracovat se vzdálenými
+  repozitáři.
 
 * Dále existuje ještě spousta dalších [nástrojů][tools]. Já osobně používám
   kromě výše zmíněných příkazů ještě `tig` a `qgit`.
@@ -167,15 +169,16 @@ schopnost pracovat s více vzdálenými repozitáři.
        git fetch osp
    V případě úspěchu bude výstup vypadat následovně:
 
-       remote: Counting objects: 17, done.
-          remote: Compressing objects: 100% (9/9), done.
-          remote: Total 10 (delta 4), reused 7 (delta 1)
-          Unpacking objects: 100% (10/10), done.
-          From ssh://rtime.felk.cvut.cz/osp/mc
-               * [new branch]          master     -> osp/master
-               * [new branch]          only-directories -> osp/only-directories
+       remote: Counting objects: 34, done.
+       remote: Compressing objects: 100% (17/17), done.
+       remote: Total 20 (delta 17), reused 6 (delta 3)
+       Unpacking objects: 100% (20/20), done.
+       From ssh://rtime.felk.cvut.cz/osp/mc
+        * [new branch]      master     -> osp/master
+        * [new branch]      only-directories -> osp/only-directories
+        * [new branch]      only-directories-old -> osp/only-directories-old
 
-3. Příkaz nám vypíše, že v repozitáři byly dvě nové větve. Všechny
+3. Příkaz nám vypíše, že v repozitáři byly tři nové větve. Všechny
    větve ze vzdálených repozitářů vypíšeme příkazem
    
        git branch -r
@@ -190,10 +193,22 @@ schopnost pracovat s více vzdálenými repozitáři.
    Tyto dva příkazy jsou ekvivalentní a vypisují commity, které jsou
    ve větvi *osp/only-directories* a zároveň nejsou (^) ve větvi *master*.
    
-   Chcete-li vidět i změny v kódu použijte jeden z následujících příkazů:
+   Chcete-li vidět i změny v kódu (patch) použijte jeden
+   z následujících příkazů:
 
        git log -p osp/only-directories ^master
-          gitk osp/only-directories ^master
+       gitk osp/only-directories ^master
+
+   Výše uvedené příkazy zobrazují změny provedené jednotlivými
+   commity. Pokud nás zajímá celková změna bez rozdělení na jednotlivé
+   committy, pomůže nám příkaz `git diff`:
+
+       git diff master..osp/only-directories
+       git diff master osp/only-directories
+
+   První příkaz zobrazí změny, které obsahuje verze *only-directories* a
+   nejsou ve větvi master. Druhý příkaz zobrazí kompletní rozdíl, tj.
+   i změny, které jsou ve větvi *master* a ne v *only-directories*.
 
 6. Podobně můžeme postupovat i s původním repozitářem. Jméno *origin*
    je výchozí a proto ho nemusíme zadávat:
@@ -207,7 +222,7 @@ Slučování větví (merge)
 -----------------------
 
 Operace slučující dvě a více větví do jedné se nazývá *merge*. V Gitu
-Můžou při slučování nastat tři situace:
+můžou při slučování nastat tři situace:
 
 * *Already up-to-date* je situace, kdy už je větev, kterou chceme
   sloučit, dosažitelná z aktuální větve (už byla sloučena v
@@ -271,7 +286,7 @@ Konflikt lze řešit několika způsoby (viz také `git merge --help`):
   commit` (jak nám git napovídá v hláškách)
 
 V průběhu řešení konfliktu je užitečné používat příkaz `git status`,
-Abychom zjistili, co je ještě potřeba vyřešit. V našem případě vypadá
+abychom zjistili, co je ještě potřeba vyřešit. V našem případě vypadá
 výstup zhruba takto:
    
     # On branch homework
@@ -307,6 +322,13 @@ Při řešení konfliktů nám může pomoct i příkaz `gitk --merge`, který
 zobrazí pouze commity, které modifikovaly konfliktní soubory.
 Jednoduše tam můžeme zjistit, které změny konflikt způsobily.
 
+Git obsahuje poměrně jednoduchý algoritmus (v porovnání s jinými
+verzovacími systémy) pro slučování různých verzí souborů. Některým
+studentům se to nelíbí a stěžují si. Přečtěte si
+[názor Linuse Torvaldse][mergealg], proč tomu tak je.
+
+[mergealg]:http://stackoverflow.com/questions/612580/how-does-git-solve-the-merging-problem/612747#612747
+
 [kdiff3]:http://kdiff3.sourceforge.net/
 
 Repozitář na GitHubu
@@ -334,24 +356,26 @@ si budou moct ostatní vaše změny stáhnout.
 3. Do svého repozitáře na GitHubu nahrajete větev z lokálního
    repozitáře některým z těchto způsobů:
 
-       git push https://github.com/<mujlogin>/mc.git homework
+       git remote add github https://github.com/<mujlogin>/mc.git
+       git push github HEAD:homework
    nebo
 
-       git push ssh://git@github.com/<mujlogin>/mc.git homework
+       git push https://github.com/<mujlogin>/mc.git homework
    nebo
 
-       git remote add github https://github.com/<mujlogin>/mc.git
-       git push github homework
+       git push ssh://git@github.com/<mujlogin>/mc.git homework
 
 [new]:https://github.com/new
 [osp-mc]:https://github.com/CTU-OSP/mc
 [forkmc]:https://github.com/CTU-OSP/mc/fork
 
+
 Zadání
 ======
 
 Proveďte sloučení větve `ssh://git@rtime.felk.cvut.cz/osp/mc
 only-directories` s aktuální vývojovou větví Midnight Commanderu
-(`origin/master`). Výsledek uložte do
+(`origin/master`). Výsledek musí jít zkompilovat a musí obsahovat
+funkcionalitu přidanou do větve `only-directories`. Výsledek uložte do
 [vámi vytvořeného repozitáře (forku) na GitHubu][forkmc] do větve
 `homework`.