]> rtime.felk.cvut.cz Git - edu/osp-wiki.git/blobdiff - cviceni/4.mdwn
Typo;
[edu/osp-wiki.git] / cviceni / 4.mdwn
index 00cc24e20ce42f1fef47762f80d4deeb8e9e37cd..b96b221e603ee697bdb5b4489162408787d0df4c 100644 (file)
@@ -5,9 +5,13 @@
 Cíl
 ===
 
-Naučit se pracovat verzovacím systémem [Git][git], zejména nás bude
-zajímat jeho využití pro distribuovaný vývojový model, který je
-výužíván mnoha open source projekty.
+Naučit se pracovat s verzovacím systémem [Git][git]. Konré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 rozhodnování jak správně vyřešit určitý konflikt.
 
 [git]:http://git-scm.com/
 
@@ -16,7 +20,7 @@ výužíván mnoha open source projekty.
 
 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][gitsurvey09-usedfor]. Jedna z často
+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
@@ -25,10 +29,10 @@ 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.
 
-[gitsurvey09-usedfor]:http://git.wiki.kernel.org/index.php/GitSurvey2009#07._I_use_Git_for_.28check_all_that_apply.29:
+[gitsurvey-usedfor]:http://www.survs.com/app/12/wo/EO2kVRp9LtOtfmGQs0tl3g/0.0.0.7.7.3.0.1.1.5.6.1.1.9.1
 
 Pro pochopení Gitu je důležité mít základní představu o tom, jak Git
-pracuje s větvemi, jak bylo popsáno v [[přednášce|intro-to-git.pdf]]
+pracuje s větvemi, což bylo popsáno v [[přednášce|prednasky/intro-to-git.pdf]]
 na slidech "*Working on branches*" a "*Working with remotes*".
 
 V tomto cvičení budeme opět pracovat s projektem
@@ -38,7 +42,7 @@ pomocí grafických nástrojů.
 
 * Příkaz `gitk` zobrazuje graficky historii a dovoluje její
   interaktivní procházení. Přijímá stejné volby jako `git log`, takže
-  v příkazech níže ho můžete použít i pro vizualizaci výstupu `git
+  v příkazech níže ho můžete použít i pro "vizualizaci" výstupu `git
   log`.
 
 * Příkaz `git gui` je grafický nástroj částečně nahrazující příkazy
@@ -110,7 +114,7 @@ Lokální větve
    Příkaz `git ls-files po m4` vypíše všechny soubory z adresářů *po*
    a *m4*, které jsou spravované gitem a příkazem `git update-index
    --assume-unchanged` pak gitu sdělíme, aby si do indexu poznamenal,
-   že tyto soubory má ignorovat.
+   že má tyto soubory ignorovat.
    
    > *Poznámka:* Možná víte o souborech *.gitignore* (viz `man
    > gitignore`), které slouží k podobnému účelu. Ostatně midnight
@@ -166,30 +170,48 @@ schopnost pracovat s více vzdálenými repozitáři.
    Vidíme, že máme nakonfigurovaný repozitář s názvem *origin* a jeho
    URL.
 
-1. Pokud chceme nějaký konkrétní vzdálený repozitář používat často,
+1. Pokud chceme nějaký vzdálený repozitář používat často,
    vyplatí se ho pojmenovat krátkým jménem (v příkladu níže *osp*),
    abychom nemuseli pořád psát dlouhé URL:
    
-        git remote add osp git://repo.or.cz/midnight-commander/osp.git
+        git remote add osp ssh://git@rtime.felk.cvut.cz/osp/mc
+
+   V tomto repozitáři je uloženo zadání dnešní úlohy. Abyste se k němu
+   dostali, musí server znát váš veřenjný SSH klíč. Jak toho docílit
+   najdete na [[samostatné stránce|rtime-git-ssh-key]]. Přístup k
+   repozitářům na serveru rtime budete potřebovat i v písemce. **Proto
+   vám důrazně doporučujeme zprovoznit přístup už na tomto cvičení,
+   abyste při písemce neztráceli čas.**
        
 2. Nyní můžeme stáhnout obsah právě přidaného repozitáře:
 
         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
+
 3. Příkaz nám vypíše, že v repozitáři byly dvě nové větve. Všechny
    větve ze vzdálených repozitářů vypíšeme příkazem
    
         git branch -r
    Zjednodušeně řečeno, jediný rozdíl mezi lokální a vzdálenou větví
-   je v tom, že vzdálená větev má prefix `<remote>/`.
+   je v tom, že jméno vzdálené věteve má prefix `<remote>/`.
 
 4. Nyní nás zajímá co je ve větvích, které jsme právě stáhli:
 
         git log osp/only-directories ^master
         git log master..osp/only-directories
    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*.
+   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 použijte jeden z následujících příkazů:
+
         git log -p osp/only-directories ^master
         gitk osp/only-directories ^master
 
@@ -246,15 +268,14 @@ obou větvích, dojde k tzv. *konfliktu*, který musí být vyřešen ručně.
         git merge osp/only-directories
    Výsledek bude vypadat pravděpodobně takto:
 
-        Renaming doc/mc.1.in => doc/man/mc.1.in
         Auto-merging doc/man/mc.1.in
-        Auto-merging src/find.c
-        CONFLICT (content): Merge conflict in src/find.c
-        Automatic merge failed; fix conflicts and then commit the result.
-   Vidíme, že git správně zjistil, že soubor `doc/mc.1.in` byl
-   v novější verzi přejmenován a provedl sloučení až po přejmenování.
-   Při slučování změn ve `src/find.c` už takové štěstí nemáme a
-   výsledkem je konflikt.
+        Auto-merging src/filemanager/find.c
+        CONFLICT (content): Merge conflict in src/filemanager/find.c
+        Automatic merge failed; fix conflicts and then commit the result. 
+
+   Vidíme, že se automaticky povedlo sloučit změny v souboru
+   `doc/mc.1.in`, ale při slučování změn ve `src/find.c` už takové
+   štěstí nemáme a výsledkem je konflikt.
         
 
 Řešení konfliktů
@@ -273,7 +294,7 @@ 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á
 výstup zhruba takhle:
    
-    # On branch merge-assignment
+    # On branch homework
     # Changes to be committed:
     #
     #  modified:   doc/man/mc.1.in
@@ -281,17 +302,30 @@ výstup zhruba takhle:
     # Unmerged paths:
     #   (use "git add/rm <file>..." as appropriate to mark resolution)
     #
-    #  both modified:      src/find.c
-    #
+    #  both modified:      src/filemanager/find.c
 
-TODO...
+Konflikt lze řešit následujícími způsoby:
 
-* editor a <<<<<<<< ========= >>>>>>>>
+* V textovém editoru najdeme sekvence `<<<<<<<<`, `=========` a
+  `>>>>>>>>`, kterými jsou označené jednotlivé konfliktní oblasti.
+  Tato místa musíme opravit tak, aby dávala smysl a poté zmíněné
+  sekvence znaků smažeme.
 * `git mergetool` je nástroj, který spouští grafický nástroj (např.
-  `kdiff3`), který vám se slučováním pomůže. `kdiff3` vám například
-  vedle sebe zobrazí 3 různé verze projektu
-* gitk --merge
-   
+  [kdiff3][kdiff3]), který vám se slučováním pomůže. 
+  
+  `kdiff3` vedle
+  sebe zobrazuje 3 různé verze projektu: poslední společná verze
+  (base), verzi z větve před slučováním (local) a verzi ze slučované
+  větve (remote) tj. té uvedené jako parametr v příkazu `git merge`.
+  
+  Ve spodní části obrazovky je pak vidět výsledek slučování, který
+  můžeme měnit buď přímou editací a nebo výběrem jednotlivých verzí
+  pomocí tlačítek A, B a C. V tomto okně je potřeba zbavit se všech
+  řadek, které maji v levém sloupci `?` - tj. konfliktů.
+* `gitk --merge` - zobrazí pouze commity, které modifikovaly
+  konfliktní soubory.
+
+[kdiff3]:http://kdiff3.sourceforge.net/
 
 Repozitář na repo.or.cz
 ---------------------------
@@ -300,7 +334,7 @@ K tomu, aby výsledky vaší práce na open source projektech byly snadno
 dostupné pro ostatní je užitečné založit si vlastní repozitář, odkud
 si budou moct ostatní vaše změny stáhnout.
 
-1. [Zaregistrujte][reg] se na [repo.or.cz][roc]. K repozitáři na
+1. [Zaregistrujte se][reg] na [repo.or.cz][roc]. K repozitáři na
    repo.or.cz se přistupuje protokolem SSH a autorizace se provádí na
    základě veřejných klíčů.
    
@@ -330,12 +364,12 @@ si budou moct ostatní vaše změny stáhnout.
 
    Můžete založit buď [nový projekt][new] a nebo udělat tzv.
    [fork existujícího projektu][forkmc]. Pro oba typy projektů můžete
-   zvolit zda bude repozitář pouze automaticky aktualizovanou kopí
-   jiného repozitáře (*mirror*) a nebo zda-li bude možné do něj přímo
-   ukládat nové commity (*push*).
+   zvolit zda bude repozitář pouze automaticky aktualizovanou kopií
+   jiného repozitáře (*mirror mode*) a nebo zda-li bude možné do něj přímo
+   ukládat nové commity (*push mode*).
    
    Pro účely tohoto cvičení si
-   [založte fork Midnight commanderu][forkmc] v *Push módu*, který se
+   [založte fork][forkmc] [Midnight commanderu][w/osp.git] v *Push módu*, který se
    bude jmenovat podle vašeho loginu. Do tohoto repozitáře pak
    nahrajete úkol z dnešního cvičení.
    
@@ -354,7 +388,9 @@ si budou moct ostatní vaše změny stáhnout.
 Zadání
 ======
 
-Proveďte sloučení větve `git://repo.or.cz/midnight-commander/osp.git
-only-directories` s aktuální vývojovou větví (`master`). Výsledek
+Proveďte sloučení větve `ssh://git@rtime.felk.cvut.cz/osp/mc
+only-directories` s aktuální vývojovou větví `origin/master`. Výsledek
 uložte do [vámi vytvořeného repozitáře (forku) na repo.or.cz][forkmc]
 do větve `homework`.
+
+[w/osp.git]:http://repo.or.cz/w/midnight-commander/osp.git