Skip to content

Commit 948fe07

Browse files
committed
Git branching: Demo a merge conflict
1 parent c164c8d commit 948fe07

2 files changed

Lines changed: 100 additions & 20 deletions

File tree

lessons/git/basics_branching.sh

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ git checkout doplneni-autora
5555
git branch
5656

5757
cat > basnicka.txt << END
58+
(Lidová)
59+
5860
Holka modrooká
5961
Nesedávej u potoka
6062
Holka modrooká
@@ -64,8 +66,6 @@ V potoce je hastrmánek
6466
Zatahá tě za copánek
6567
Holka modrooká
6668
Nesedávej tam
67-
68-
- Lidová
6969
END
7070

7171
git add basnicka.txt
@@ -79,8 +79,7 @@ git checkout doplneni-jmena
7979
git branch
8080

8181
cat > basnicka.txt << END
82-
Holka modrooká
83-
=========
82+
Holka Modrooká
8483
8584
Holka modrooká
8685
Nesedávej u potoka
@@ -101,6 +100,28 @@ take_screenshot $OUTFILE.branches.png gitk --all
101100
git checkout master
102101
git merge doplneni-jmena
103102
git merge doplneni-autora
103+
git status
104+
cat basnicka.txt
105+
git diff
106+
107+
cat > basnicka.txt << END
108+
Holka modrooká
109+
(Lidová)
110+
111+
Holka modrooká
112+
Nesedávej u potoka
113+
Holka modrooká
114+
Nesedávej tam
115+
116+
V potoce je hastrmánek
117+
Zatahá tě za copánek
118+
Holka modrooká
119+
Nesedávej tam
120+
END
121+
122+
git add basnicka.txt
123+
GIT_EDITOR='true' git commit
124+
104125
git branch
105126

106127
take_screenshot $OUTFILE.merge.png gitk --all

lessons/git/branching/index.md

Lines changed: 75 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ Switched to branch 'doplneni-autora'
6363
```
6464

6565
Tak. Teď jsi „ve” větvi `doplneni-autora`.
66-
Doplň nějaké jméno do souboru `basnicka.txt`,
66+
Doplň nějaké jméno na začátek souboru `basnicka.txt`,
6767
a pomocí `git add` a `git commit` udělej novou revizi.
6868
Pak koukni na `gitk --all`, jak to vypadá:
6969

@@ -93,7 +93,8 @@ Switched to branch 'doplneni-jmena'
9393
master␛[m
9494
```
9595

96-
Doplň do souboru jméno básně a pomocí
96+
Doplň jméno básně na začátek souboru (tedy na stejné místo,
97+
jako je v druhé větvi název) a pomocí
9798
`git add`, `git commit` ulož revizi.
9899
Všechno zkontroluj přes `gitk --all`.
99100

@@ -125,7 +126,8 @@ zpátky do `master`. Podívejme se jak na to.
125126

126127
Nedávalo by smysl historii projektu rozdvojovat,
127128
kdyby pak jednotlivé větve nešly zase sloučit dohromady.
128-
Naštěstí je v Gitu slučování poměrně jednoduché.
129+
V Gitu je většinou slučování poměrně jednoduché, ale tento příklad schválně
130+
ukazuje nejsložitější variantu, která může nastat.
129131

130132
Přepni se zpátky na `master`
131133
a použij příkaz `git merge`, který
@@ -148,25 +150,82 @@ vlastně nebylo co slučovat – jen se do větve
148150
Zkontroluj v `gitk --all`, jak to vypadá.
149151

150152
A pak zkus sloučit i druhou větev: `git merge doplneni-autora`.
151-
Tady to bude složitější: Může se stát, že změny nepůjdou
153+
Tady to bude složitější: pravděpodobně se stane, že změny nepůjdou
152154
automaticky sloučit a ve výstupu se objeví hláška
153-
`merge conflict` (slučovací konflikt).
155+
`merge conflict` (slučovací konflikt):
156+
157+
```ansi
158+
␛[36m$␛[0m git merge doplneni-autora
159+
Auto-merging basnicka.txt
160+
CONFLICT (content): Merge conflict in basnicka.txt
161+
Automatic merge failed; fix conflicts and then commit the result.
162+
```
163+
164+
> [note] A když ne?
165+
> Jestli se konflikt neobjevil, Git změny sloučil sám.
166+
> Gratuluji! Zbytek téhle sekce bude jen teoretický; vrať se sem, až se ti
167+
> někdy „podaří“ konflikt udělat.
168+
169+
Když nastane konflikt, `git status` ukáže „both modified“ – tedy že byl soubor
170+
změněný v obou slučovaných větvích:
171+
172+
```ansi
173+
␛[36m$␛[0m git status
174+
On branch master
175+
You have unmerged paths.
176+
(fix conflicts and run "git commit")
177+
(use "git merge --abort" to abort the merge)
178+
179+
Unmerged paths:
180+
(use "git add <file>..." to mark resolution)
181+
␛[31mboth modified: basnicka.txt␛[m
182+
183+
no changes added to commit (use "git add" and/or "git commit -a")
184+
```
154185
V tom případě se na soubor podívej v editoru: objeví
155186
se v něm obsah z obou konfliktních verzí,
156-
společně se značkami, které upozorňují na místo
157-
kde konflikt nastal.
158-
Soubor uprav ho tak, jak by měl vypadat, ulož a zadej
159-
`git commit`.
187+
společně se značkami `<<<<<<<`, `=======` a `>>>>>>>`, které upozorňují na
188+
místo kde konflikt nastal.
189+
190+
Značky ukáže i příkaz `git diff`, jehož výstup je teď trošku složitější:
191+
192+
```ansi
193+
␛[36m$␛[0m git diff
194+
␛[1mdiff --cc basnicka.txt␛[m
195+
␛[1mindex bc7a2de,88e7ea5..0000000␛[m
196+
␛[1m--- a/basnicka.txt␛[m
197+
␛[1m+++ b/basnicka.txt␛[m
198+
␛[36m@@@ -1,4 -1,4 +1,8 @@@␛[m
199+
␛[32m++<<<<<<< HEAD␛[m
200+
␛[32m +Holka Modrooká␛[m
201+
␛[32m++=======␛[m
202+
␛[32m+ (Lidová)␛[m
203+
␛[32m++>>>>>>> doplneni-autora␛[m
204+
␛[m
205+
Holka modrooká␛[m
206+
Nesedávej u potoka␛[m
207+
```
208+
209+
Konflikty a značky, které můžou být nepřehledné, ukazuje Git ze stejného důvodu
210+
jako Python chybové hlášky: tedy aby ti co nejvíce pomohl.
211+
Git je jen „hloupý“ nástroj a s konfliktem si neporadí sám, ale snaží se
212+
ti řešení konfliktu co nejvíc usnadnit.
213+
214+
Proto hlavně nepanikař!
215+
Soubor otevři v editoru a uprav **tak, jak by měl vypadat**.
216+
Značky jako `<<<<<<<` smaž; řádky poskládej tak, jak by měly jít za sebou.
217+
(A pracuješ-li na kódu, spusť testy a ověř, jestli všechno stále funguje.)
218+
219+
Pak soubor ulož a zadej `git commit`.
160220

161221
Ať nastal konflikt nebo ne, vytvoří se „slučovací revize“
162222
(angl. *merge commit*), které – jako každé revizi – můžeš dát popisek.
223+
Tentokrát je popisek už předvyplněný; chceš-li nějaký jiný, nahraď ho.
163224

164225
```ansi
165-
␛[36m$␛[0m git merge doplneni-autora
166-
Auto-merging basnicka.txt
167-
Merge made by the 'recursive' strategy.
168-
basnicka.txt | 2 ␛[32m++␛[m
169-
1 file changed, 2 insertions(+)
226+
␛[36m$␛[0m git add basnicka.txt
227+
␛[36m$␛[0m git commit
228+
[master 884b30a] Merge branch 'doplneni-autora'
170229
```
171230

172231
Povedlo se?
@@ -181,9 +240,9 @@ změny jsou v `master` a nemá na nich cenu
181240
pracovat dál.
182241

183242
```ansi
184-
␛[36m$␛[0m git branch -d doplneni-autora
243+
␛[36m$␛[0m git branch --delete doplneni-autora
185244
Deleted branch doplneni-autora (was f1cd9be).
186-
␛[36m$␛[0m git branch -d doplneni-jmena
245+
␛[36m$␛[0m git branch --delete doplneni-jmena
187246
Deleted branch doplneni-jmena (was 5c9bf93).
188247
␛[36m$␛[0m git branch
189248
* ␛[32mmaster␛[m

0 commit comments

Comments
 (0)