sp-tutorial 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +42 -0
- data/Rakefile +36 -0
- data/TODO +6 -0
- data/VERSION.yml +4 -0
- data/config.ru +15 -0
- data/lib/config.ru +15 -0
- data/lib/public/doc/Cyklop-otf-0_91.zip +0 -0
- data/lib/public/doc/ex/sp_lab01_zad.odt +0 -0
- data/lib/public/doc/ex/sp_lab02_zad.odt +0 -0
- data/lib/public/doc/ex/sp_lab03_zad.odt +0 -0
- data/lib/public/doc/ex/sp_lab04_zad.odt +0 -0
- data/lib/public/doc/latexsheet.pdf +0 -0
- data/lib/public/doc/survival.pdf +0 -0
- data/lib/public/images/Thatll_Flat_Git_It_Vol_20.jpg +0 -0
- data/lib/public/images/alan_kay.jpg +0 -0
- data/lib/public/images/alan_perlis.jpg +0 -0
- data/lib/public/images/albert_einstein.jpg +0 -0
- data/lib/public/images/algorithm.png +0 -0
- data/lib/public/images/biuletyn-snall.jpg +0 -0
- data/lib/public/images/bop.jpg +0 -0
- data/lib/public/images/borenstein.jpg +0 -0
- data/lib/public/images/commits.png +0 -0
- data/lib/public/images/gitk-branches.png +0 -0
- data/lib/public/images/jkew.jpg +0 -0
- data/lib/public/images/jwz.gif +0 -0
- data/lib/public/images/knuth.jpg +0 -0
- data/lib/public/images/marcin_wolinski.jpg +0 -0
- data/lib/public/images/objects-example.png +0 -0
- data/lib/public/images/perlis.gif +0 -0
- data/lib/public/images/real_programmers.png +0 -0
- data/lib/public/images/richard_stallman.jpg +0 -0
- data/lib/public/images/sp.png +0 -0
- data/lib/public/images/sp.svg +117 -0
- data/lib/public/images/spowrotem.jpg +0 -0
- data/lib/public/images/staging_area.png +0 -0
- data/lib/public/images/the_thinker.jpg +0 -0
- data/lib/public/images/tparr.jpg +0 -0
- data/lib/public/images/wide-gitk.gif +0 -0
- data/lib/public/javascripts/sp.js +1 -0
- data/lib/public/stylesheets/fonts/Cyklop-Italic.otf +0 -0
- data/lib/public/stylesheets/icons/doc.png +0 -0
- data/lib/public/stylesheets/icons/email.png +0 -0
- data/lib/public/stylesheets/icons/external.png +0 -0
- data/lib/public/stylesheets/icons/feed.png +0 -0
- data/lib/public/stylesheets/icons/im.png +0 -0
- data/lib/public/stylesheets/icons/pdf.png +0 -0
- data/lib/public/stylesheets/icons/visited.png +0 -0
- data/lib/public/stylesheets/icons/xls.png +0 -0
- data/lib/public/stylesheets/ie.css +27 -0
- data/lib/public/stylesheets/print.css +30 -0
- data/lib/public/stylesheets/screen.css +249 -0
- data/lib/public/stylesheets/sp.css +194 -0
- data/lib/public/stylesheets/src/grid.png +0 -0
- data/lib/public/stylesheets/uv.css +121 -0
- data/lib/sp-tutorial.rb +78 -0
- data/lib/views/answers.rdiscount +7 -0
- data/lib/views/exercises.rdiscount +154 -0
- data/lib/views/favicon.ico.rdiscount +0 -0
- data/lib/views/git.rdiscount +558 -0
- data/lib/views/labs01.rdiscount +54 -0
- data/lib/views/labs02.rdiscount +32 -0
- data/lib/views/labs03.rdiscount +28 -0
- data/lib/views/labs04.rdiscount +41 -0
- data/lib/views/latex.rdiscount +498 -0
- data/lib/views/layout.rdiscount +41 -0
- data/lib/views/ll.rdiscount +78 -0
- data/lib/views/main.rdiscount +67 -0
- data/lib/views/scripts.rdiscount +618 -0
- data/lib/views/unix-commands.rdiscount +604 -0
- data/lib/views/unix-guru.rdiscount +696 -0
- data/sp-tutorial.gemspec +125 -0
- metadata +186 -0
File without changes
|
@@ -0,0 +1,558 @@
|
|
1
|
+
#### {% title "Git jest git" %}
|
2
|
+
|
3
|
+
# Git jest git
|
4
|
+
|
5
|
+
<blockquote>
|
6
|
+
{%= image_tag "/images/jwz.gif", :alt => "[Jamie Zawinski]" %}
|
7
|
+
<p>
|
8
|
+
Zawinski's Law: Every program attempts to expand until it can read
|
9
|
+
mail. Those programs which cannot so expand are replaced by ones
|
10
|
+
which can.
|
11
|
+
</p>
|
12
|
+
<p class="author">— <a href="http://www.jwz.org/">Jamie Zawinski</a></p>
|
13
|
+
</blockquote>
|
14
|
+
|
15
|
+
Do czego służy system *Git*? Odpowiedź znajdziemy na stronie domowej projektu
|
16
|
+
[Git - Fast Version Control System] [git home].
|
17
|
+
|
18
|
+
Obejrzenie wystąpienia autora Linuksa:
|
19
|
+
[Tech Talk: Linus Torvalds on git] [torvalds on git]
|
20
|
+
dla pracowników Google powinno wyjaśnić dlaczego powstał Git
|
21
|
+
i dlaczego Google więcej już nie poprosi LT o wygłoszenie referatu.
|
22
|
+
|
23
|
+
Randal L. Schwartz “Guru-On-Demand” jest autorem najlepszego
|
24
|
+
wprowadzenia do języka Perl jakie czytałem. Z jego
|
25
|
+
screencastu [Git] [schwartz on git] można dowiedzieć się
|
26
|
+
jak Git zmienił jego życie.
|
27
|
+
|
28
|
+
Tom Preston-Werner w [Git Przypowieści] [the-git-parable] napisał:
|
29
|
+
„Most people try to teach Git by demonstrating a few dozen commands
|
30
|
+
and then yelling “tadaaaaa.” I believe this method is flawed. Such
|
31
|
+
a treatment may leave you with the ability to use Git to perform
|
32
|
+
simple tasks, but the Git commands will still feel like magical
|
33
|
+
incantations.”
|
34
|
+
|
35
|
+
Przypowieść ta opisuje perypetie czeladnika tworzącego system
|
36
|
+
gitopodobny od podstaw.
|
37
|
+
|
38
|
+
Różne: S. Chacon, [Git in One Hour] [git-in-one-hour].
|
39
|
+
|
40
|
+
|
41
|
+
## Konfiguracja
|
42
|
+
|
43
|
+
<blockquote>
|
44
|
+
<p>
|
45
|
+
Podchodzi informatyk do fortepianu i ogląda go wnikliwie:
|
46
|
+
— Hmm, tylko 84
|
47
|
+
klawisze, z czego 1/3 funkcyjnych, wszystkie nieopisane,
|
48
|
+
chociaż… shift naciskany nogą. Oryginalnie.
|
49
|
+
</p>
|
50
|
+
</blockquote>
|
51
|
+
|
52
|
+
Pracę z gitem zaczynamy od przedstawienia się:
|
53
|
+
|
54
|
+
git config -l
|
55
|
+
git config --global user.name "Wlodek Bzyl"
|
56
|
+
git config --global user.email "matwb@univ.gda.pl"
|
57
|
+
|
58
|
+
po czym natychmiast sprawdzamy, czy Git zrozumiał kim jesteśmy:
|
59
|
+
|
60
|
+
cat ~/.gitconfig
|
61
|
+
|
62
|
+
Łatwiej będzie nam porozumiewać się z Gitem, po dodaniu do pliku
|
63
|
+
konfiguracyjnego kilku skrótów:
|
64
|
+
|
65
|
+
git config --global alias.br branch -a
|
66
|
+
git config --global alias.co checkout
|
67
|
+
git config --global alias.ci commit
|
68
|
+
git config --global alias.df diff
|
69
|
+
git config --global alias.lg log -p
|
70
|
+
git config --global alias.st status
|
71
|
+
|
72
|
+
Ułatwimy sobie śledzenie zmian w kodzie jeśli je podkolorujemy:
|
73
|
+
|
74
|
+
git config --global color.branch auto
|
75
|
+
git config --global color.diff auto
|
76
|
+
git config --global color.status auto
|
77
|
+
|
78
|
+
Jeszcze trochę ręcznych robótek, bo czemu nie, w pliku konfiguracyjnym
|
79
|
+
i oto rezultat — mój plik *~/.gitconfig* w całej okazałości:
|
80
|
+
|
81
|
+
:::ini
|
82
|
+
[user]
|
83
|
+
email = matwb@univ.gda.pl
|
84
|
+
name = Wlodek Bzyl
|
85
|
+
|
86
|
+
[color]
|
87
|
+
branch = auto
|
88
|
+
diff = auto
|
89
|
+
status = auto
|
90
|
+
|
91
|
+
[color]
|
92
|
+
ui = true
|
93
|
+
|
94
|
+
[core]
|
95
|
+
whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol
|
96
|
+
|
97
|
+
[alias]
|
98
|
+
br = branch -a
|
99
|
+
co = checkout
|
100
|
+
ci = commit
|
101
|
+
df = diff
|
102
|
+
lg = log -p
|
103
|
+
st = status
|
104
|
+
|
105
|
+
i po konfiguracji.
|
106
|
+
|
107
|
+
Wygodnie też jest mieć kilka aliasów w bashu.
|
108
|
+
Dopisujemy je do pliku *~/.bashrc*:
|
109
|
+
|
110
|
+
:::shell-unix-generic
|
111
|
+
alias gb='git branch -a'
|
112
|
+
alias gl='git log -p'
|
113
|
+
alias gt='git status'
|
114
|
+
|
115
|
+
|
116
|
+
<blockquote>
|
117
|
+
<h1>Zasłyszane</h1>
|
118
|
+
<p>
|
119
|
+
Q: Couldn't this be done using a Git repo?<br/>
|
120
|
+
A: What's that “Git” thing?
|
121
|
+
Diversion system is developed using “Mother Driven Development”.
|
122
|
+
With this system, you keep asking yourself:
|
123
|
+
<em>Would my mother understand this?</em>
|
124
|
+
</p>
|
125
|
+
<p>
|
126
|
+
Call it the poor man’s approach to usability.
|
127
|
+
</p>
|
128
|
+
</blockquote>
|
129
|
+
|
130
|
+
|
131
|
+
## Podstawy
|
132
|
+
|
133
|
+
### Zakładamy repozytorium
|
134
|
+
|
135
|
+
Pierwsze repozytorium, zgodnie ze starą uniksową tradycją
|
136
|
+
powinno mieć nazwę *hello-world*:
|
137
|
+
|
138
|
+
mkdir hello-world
|
139
|
+
cd hello-world
|
140
|
+
git init
|
141
|
+
touch .gitignore README.md Makefile hello.c
|
142
|
+
git add .
|
143
|
+
git commit -m "pierwsza wrzutka"
|
144
|
+
|
145
|
+
Każdy plik w systemie Git może mieć aż trzy życia:
|
146
|
+
jedno w „drzewie roboczym”, drugie w „indeks” i trzecie w „trunk”:
|
147
|
+
|
148
|
+
git diff # shows you the differences from index to working tree
|
149
|
+
git diff HEAD # shows you the differences from trunk to working tree
|
150
|
+
git diff --cached # shows you the differences from trunk to index
|
151
|
+
|
152
|
+
Do czego służy drugie życie opisał Ryan Tomayko na swoim blogu,
|
153
|
+
[The Thing About Git] [tomayko about git].
|
154
|
+
|
155
|
+
|
156
|
+
<blockquote cite="http://www.gitready.com/beginner/2009/01/18/the-staging-area.html">
|
157
|
+
{%= image_tag "/images/staging_area.png", :alt => "[working tree / index / trunk]" %}
|
158
|
+
</blockquote>
|
159
|
+
|
160
|
+
Na *indeks* mówimy też *staging area* (punkt etapowy, punkt tranzytowy),
|
161
|
+
*working tree* tłumaczymy na drzewo robocze (kopia robocza?),
|
162
|
+
a *trunk* to *trunk*.
|
163
|
+
|
164
|
+
|
165
|
+
### Git na codzień
|
166
|
+
|
167
|
+
Zazwyczaj praca z repozytorium wygląda tak:
|
168
|
+
|
169
|
+
... edycja, edycja ...
|
170
|
+
git status
|
171
|
+
git add [nazwy plików albo .]
|
172
|
+
git commit -m "jakiś wpis do loga"
|
173
|
+
... edycja, edycja ...
|
174
|
+
git status
|
175
|
+
... i tak w kółko ...
|
176
|
+
|
177
|
+
|
178
|
+
<blockquote>
|
179
|
+
<p>
|
180
|
+
Przychodzi administrator rano do pracy, siada do komputera, aby
|
181
|
+
zobaczyć co się działo w nocy i śpiewa: <em>Chcę oglądać twoje logi,
|
182
|
+
logi, logi, logi…</em>
|
183
|
+
</p>
|
184
|
+
</blockquote>
|
185
|
+
|
186
|
+
|
187
|
+
### Przeglądanie logów i nie tylko
|
188
|
+
|
189
|
+
Użytecznymi programami są przeglądarki repozytoriów.
|
190
|
+
Na *Sigmie* jest zainstalowana przeglądarka *gitk*.
|
191
|
+
|
192
|
+
W logach zapisane są „commit messages”, z których łatwo się
|
193
|
+
wyczytać co zostało zrobione i przez kogo. Dlatego logi są często
|
194
|
+
przeglądane. Kilka przykładów:
|
195
|
+
|
196
|
+
:::shell-unix-generic
|
197
|
+
git log
|
198
|
+
git log -p
|
199
|
+
git log --grep 'important'
|
200
|
+
git log -Sword # search thru history
|
201
|
+
git log --pickaxe-regex -S'\bword\b' # with regexp
|
202
|
+
git log origin/master..HEAD
|
203
|
+
|
204
|
+
Repozytorium git składa się z czterech rodzajów obiektów:
|
205
|
+
**commit**, **tree**, **blob** i **tag**.
|
206
|
+
Powyższe polecenia z *log* służą tylko do przeglądania
|
207
|
+
obiektów typu *commit*.
|
208
|
+
|
209
|
+
{%= image_tag "/images/commits.png", :alt => "[git log]" %}
|
210
|
+
|
211
|
+
Źródło, S. Chacon, [Pro Git, What a Branch Is](http://progit.org/book/ch3-1.html).
|
212
|
+
|
213
|
+
|
214
|
+
Polecenie `git show` służy do wypisywania zawartości obiektów
|
215
|
+
dowolnego typu. Czasami używamy bardziej specjalizowanych
|
216
|
+
poleceń:
|
217
|
+
|
218
|
+
:::shell-unix-generic
|
219
|
+
git ls-tree SHA1 # obiekt tree
|
220
|
+
git show -s --pretty=raw SHA1 # obiekt commit
|
221
|
+
git cat-file tag v1.0 # obiekt tag
|
222
|
+
|
223
|
+
Obiekty są powiązane „wskaźnikami” SHA1. Tak to powiązanie możemy
|
224
|
+
sobie wyobrażać:
|
225
|
+
|
226
|
+
{%= image_tag "/images/objects-example.png", :alt => "[Powiązania między obiektami]" %}
|
227
|
+
|
228
|
+
Źródło, [Git Community Book](http://book.git-scm.com/1_the_git_object_model.html).
|
229
|
+
|
230
|
+
|
231
|
+
### Undo różnych rzeczy
|
232
|
+
|
233
|
+
Zmieniamy **ostatni** wpis w logu:
|
234
|
+
|
235
|
+
git commit --amend
|
236
|
+
|
237
|
+
Unstaging staged plik:
|
238
|
+
|
239
|
+
git add .
|
240
|
+
git status
|
241
|
+
# On branch master
|
242
|
+
# Changes to be committed:
|
243
|
+
# (use "git reset HEAD <file>..." to unstage)
|
244
|
+
#
|
245
|
+
# modified: README.md
|
246
|
+
|
247
|
+
Wycofanie zmian w edytowanym pliku:
|
248
|
+
|
249
|
+
# Changed but not updated:
|
250
|
+
# (use "git add <file>..." to update what will be committed)
|
251
|
+
# (use "git checkout -- <file>..." to discard changes in working directory)
|
252
|
+
#
|
253
|
+
# modified: README.md
|
254
|
+
|
255
|
+
|
256
|
+
## Branching
|
257
|
+
|
258
|
+
*Pytanie*: Czym jest gałąź? (odgałęzienie?)
|
259
|
+
|
260
|
+
*Odpowiedź*: A branch in Git is simply a lightweight movable pointer
|
261
|
+
to one of these commits.
|
262
|
+
|
263
|
+
Gałęzie Gita najlepiej rozrysował S. Chacon w swojej książce:
|
264
|
+
[Pro Git] [progit branches]
|
265
|
+
|
266
|
+
|
267
|
+
### Tworzenie gałęzi w projekcie i ich scalanie
|
268
|
+
|
269
|
+
Przećwiczmy następujący scenariusz:
|
270
|
+
|
271
|
+
* Tworzymy serwis www z dowcipami.
|
272
|
+
* Tworzymy nową gałąź o nazwie *newidea* na nowy dowcip
|
273
|
+
i przenosimy się na nią.
|
274
|
+
* Zaczynamy pisać nowy dowcip.
|
275
|
+
|
276
|
+
W trakcie pracy nad dowcipem dostajemy wiadomość,
|
277
|
+
że strona główna jest zawirusowana.
|
278
|
+
Przerywamy pracę nad nowym dowcipem i zabieramy się
|
279
|
+
za szukanie wirusa.
|
280
|
+
|
281
|
+
<blockquote>
|
282
|
+
{%= image_tag "/images/spowrotem.jpg", :alt => "[z powrotem]" %}
|
283
|
+
</blockquote>
|
284
|
+
|
285
|
+
* Wracamy na główną gałąź.
|
286
|
+
* Tworzymy nową gałąź o nazwie *hotfix*,
|
287
|
+
gdzie będziemy robić poprawki.
|
288
|
+
* Po przetestowaniu poprawek,
|
289
|
+
scalamy gałąź *hotfix* z gałęzią główną.
|
290
|
+
* Przenosimy się z powrotem na gałąź *newidea*
|
291
|
+
gdzie kończymy pisać nowy dowcip.
|
292
|
+
|
293
|
+
A teraz konkrety. Serwis będzie dostępny z takiego URL:
|
294
|
+
|
295
|
+
http://sigma.inf.ug.edu.pl/~wbzyl/dowcipy/
|
296
|
+
|
297
|
+
Na początek serwis www będzie się składał z jednej strony:
|
298
|
+
*index.html*.
|
299
|
+
|
300
|
+
1\. Zakładamy repozytorium:
|
301
|
+
|
302
|
+
mkdir ~/public_html/dowcipy/
|
303
|
+
cd ~/public_html/dowcipy/
|
304
|
+
git init
|
305
|
+
cat index.html
|
306
|
+
Jestem albańskim wirusem komputerowym, ale z uwagi
|
307
|
+
na słabe zaawansowanie informatyczne mojego kraju
|
308
|
+
nie mogę nic ci zrobić.
|
309
|
+
Proszę skasuj sobie jakiś plik i prześlij mnie dalej.
|
310
|
+
...
|
311
|
+
git add index.html
|
312
|
+
git commit -m "pierwsza wrzutka"
|
313
|
+
|
314
|
+
2\. Nowa gałąź:
|
315
|
+
|
316
|
+
git checkout -b newidea
|
317
|
+
cat >> index.html
|
318
|
+
Webmaster wypełnia podanie o dowód.
|
319
|
+
Data urodzenia: 31.11.1990
|
320
|
+
Wzrost: 190
|
321
|
+
...
|
322
|
+
|
323
|
+
3\. Dostajemy wiadomość…
|
324
|
+
|
325
|
+
git checkout master
|
326
|
+
git checkout -b hotfix
|
327
|
+
|
328
|
+
4\. Szybko znajdujemy wirusa. Zawirusowany tekst zastępujemy
|
329
|
+
tekstem bez wirusa:
|
330
|
+
|
331
|
+
cat > index.html
|
332
|
+
Żona wysyła męża programistę do sklepu.
|
333
|
+
— Kup parówki, jak będą jajka, kup dziesięć.
|
334
|
+
Mąż w sklepie:
|
335
|
+
— Są jajka?
|
336
|
+
— Tak
|
337
|
+
— Poproszę dziesięć parówek.
|
338
|
+
|
339
|
+
5\. Czytamy dowcip kolegom. Ponieważ teraz wydaje się,
|
340
|
+
że wszystko jest OK, wykonujemy:
|
341
|
+
|
342
|
+
git commit -m "usunięto wirusa"
|
343
|
+
git checkout master
|
344
|
+
git merge hotfix
|
345
|
+
git branch -d hotfix
|
346
|
+
|
347
|
+
6\. Kończymy nowy dowcip:
|
348
|
+
|
349
|
+
git checkout newidea
|
350
|
+
cat >> index.html
|
351
|
+
Kolor oczu: #4040EE
|
352
|
+
|
353
|
+
Testujemy czy wszystko jest OK. Jeśli tak, to jak poprzednio
|
354
|
+
scalamy *master* z *newidea* i usuwamy *newidea*.
|
355
|
+
|
356
|
+
|
357
|
+
### Remote branches
|
358
|
+
|
359
|
+
Dodajemy oryginalny projekt jako *remote*.
|
360
|
+
|
361
|
+
Forkuję projekt
|
362
|
+
|
363
|
+
http://github.com/technomancy/emacs-starter-kit
|
364
|
+
|
365
|
+
i tworzę klon sforkowanego projektu na swoim komputerze:
|
366
|
+
|
367
|
+
git clone git@github.com:wbzyl/emacs-starter-kit.git
|
368
|
+
|
369
|
+
Teraz dodaję do klona oryginalny projekt jako *remote* repozytorium:
|
370
|
+
|
371
|
+
git remote add technomancy git://github.com/technomancy/emacs-starter-kit.git
|
372
|
+
|
373
|
+
Po dodaniu gałęzi remote, wykonujemy polecenie:
|
374
|
+
|
375
|
+
git fetch technomancy
|
376
|
+
|
377
|
+
ściągając na gałąź *technomancy* najnowszą wersję projektu
|
378
|
+
z serwera *github.com*.
|
379
|
+
|
380
|
+
Sprawdzamy co zostało zrobione. Wykonujemy polecenie:
|
381
|
+
|
382
|
+
git remote
|
383
|
+
origin
|
384
|
+
technomancy
|
385
|
+
|
386
|
+
i widzimy że wszystko jest w porządku: mamy dwie gałęzie remote.
|
387
|
+
|
388
|
+
Polecenie:
|
389
|
+
|
390
|
+
git branch -a
|
391
|
+
|
392
|
+
daje nieco więcej informacji od poprzedniego polecenia:
|
393
|
+
|
394
|
+
* master
|
395
|
+
origin/HEAD
|
396
|
+
origin/master
|
397
|
+
technomancy/master
|
398
|
+
technomancy/personalizations
|
399
|
+
|
400
|
+
|
401
|
+
Po co to zrobiliśmy? Teraz możemy porównać nową wersję ze swoja i
|
402
|
+
scalić nową wersję ze swoim projektem.
|
403
|
+
|
404
|
+
|
405
|
+
### Prostowanie historii, czyli rebasing
|
406
|
+
|
407
|
+
Zobacz też [The Basic Rebase] (http://progit.org/book/ch3-6.html)
|
408
|
+
|
409
|
+
Zakładamy repo:
|
410
|
+
|
411
|
+
mkdir test
|
412
|
+
cd test
|
413
|
+
cat > README.md
|
414
|
+
# Hello project
|
415
|
+
.. ctrl+d
|
416
|
+
git init
|
417
|
+
git add .
|
418
|
+
git commit -m "wrzutka: 1."
|
419
|
+
gitk
|
420
|
+
|
421
|
+
Nowy pomysł:
|
422
|
+
|
423
|
+
git checkout -b newidea
|
424
|
+
cat > README.md
|
425
|
+
# Hello world project
|
426
|
+
.. ctrl+d
|
427
|
+
git commit -m "wrzutka z gałęzi newidea: 1." -a
|
428
|
+
cat >> README.md
|
429
|
+
Kolekcja programów hello world.
|
430
|
+
.. ctrl+d
|
431
|
+
git commit -m "wrzutka z gałęzi newidea: 2." -a
|
432
|
+
gitk
|
433
|
+
|
434
|
+
Przechodzimy na główną gałąź:
|
435
|
+
|
436
|
+
git checkout master
|
437
|
+
cat >> README.md
|
438
|
+
## Ruby
|
439
|
+
print "hello world"
|
440
|
+
.. ctrl+d
|
441
|
+
git commit -m "wrzutka: 2." -a
|
442
|
+
gitk
|
443
|
+
|
444
|
+
Przechodzimy na newidea:
|
445
|
+
|
446
|
+
git checkout newidea
|
447
|
+
git rebase master # rebase wykonujemy z gałęzi newidea
|
448
|
+
git checkout master
|
449
|
+
gitk
|
450
|
+
|
451
|
+
Wracamy na główną gałąź i usuwamy gałąź *newidea*:
|
452
|
+
|
453
|
+
git merge newidea # powinno być fast-forward
|
454
|
+
gitk
|
455
|
+
git branch -d newidea
|
456
|
+
gitk
|
457
|
+
|
458
|
+
|
459
|
+
## Praca rozproszona z *Githubem*
|
460
|
+
|
461
|
+
Przykład: wspólna praca nad projektem *jBlog*.
|
462
|
+
|
463
|
+
Ala zakłada konto *as007* na serwerze *github.com*, a następnie
|
464
|
+
loguje się na swoje nowe konto.
|
465
|
+
|
466
|
+
Po zalogowaniu wchodzi na stronę *https://github.com/account*, gdzie
|
467
|
+
dodaje klucz publiczny swojego komputera do *SSH Public Keys*.
|
468
|
+
W ten sposób, Ala zapewnia sobie możliwość wykonywania *push*
|
469
|
+
ze swojego komputera na serwer *github.com*.
|
470
|
+
|
471
|
+
1. Teraz wchodzi na na stronę z projektem
|
472
|
+
*http://github.com/wbzyl/jblog/*, gdzie klika w ikonkę *fork*.
|
473
|
+
1. Po sforkowaniu projektu, wchodzi z powrotem na swoją stronę:
|
474
|
+
*http://github.com/as007/* i widzi, że projekt
|
475
|
+
*jblog* pojawił się na liście **jej** projektów.
|
476
|
+
1. Po kliknięciu na link z nazwą *jblog* zostaje przekierowana
|
477
|
+
na stronę *http://github.com/as007/jblog*.
|
478
|
+
Na tej stronie jest link **Your Clone URL**:
|
479
|
+
*git@github.com:as007/jblog.git*.
|
480
|
+
1. Używając tego URL-a, Ala klonuje sforkowane repozytorium na
|
481
|
+
swój komputer.
|
482
|
+
|
483
|
+
Teraz zaczyna robić się ciekawie.
|
484
|
+
|
485
|
+
1. Ala dodaje nowy wpis do bloga, tworząc w katalogu *_posts*
|
486
|
+
sforkowanego repozytorium plik *2009-10-10-mercurial.markdown*. Plik
|
487
|
+
ten dodaje do repozytorium, wykonuje commit i push na
|
488
|
+
*github.com*.
|
489
|
+
1. Teraz ze strony projektu: *http://github.com/as007/jblog*
|
490
|
+
klika w ikonkę *pull request*.
|
491
|
+
|
492
|
+
W ten sposób Ala wysłała do mnie *pull request*.
|
493
|
+
Ja po otrzymaniu *pull request* dodaję repozytorium Ali
|
494
|
+
jako *remote* do mojego repozytrorium *jblog*:
|
495
|
+
|
496
|
+
git add remote as007 git://github.com/as007/jblog.git
|
497
|
+
|
498
|
+
1. Następnie ściągam remote repo: `git fetch as007`.
|
499
|
+
1. Patrzę co zostało zrobione: `git diff as007/master`.
|
500
|
+
1. Scalam oba projekty: `git merge as007/master`.
|
501
|
+
1. Wykonuję commit i push.
|
502
|
+
|
503
|
+
|
504
|
+
## Zalety *nagich* repozytoriów
|
505
|
+
|
506
|
+
Jak utworzyć nagie repozytorium?
|
507
|
+
Załóżmy, że w katalogu *~/tmp/* mamy repozytorium *photos*.
|
508
|
+
Po wykonaniu polecenia:
|
509
|
+
|
510
|
+
git clone --bare ~/tmp/photos ~/public_git/photos.git
|
511
|
+
|
512
|
+
Skąd takie określenie *nagi*. Wykonanie polecenia:
|
513
|
+
|
514
|
+
ls ~/public_git/photos.git
|
515
|
+
|
516
|
+
powinno to wyjaśnić.
|
517
|
+
|
518
|
+
Zaletą posiadania nagiego repozytorium jest możliwość pracy
|
519
|
+
rozproszonej, takiej jak z repozytoriami githuba.
|
520
|
+
|
521
|
+
|
522
|
+
<blockquote>
|
523
|
+
<p>
|
524
|
+
Wsiada informatyk do taksówki. Taksiarz pyta:<br/>
|
525
|
+
— Dokąd jedziemy?<br/>
|
526
|
+
— 127.0.0.1
|
527
|
+
</p>
|
528
|
+
</blockquote>
|
529
|
+
|
530
|
+
|
531
|
+
## Tak klonujemy projekty z *Sigmy*
|
532
|
+
|
533
|
+
Korzystając z protokołu GIT:
|
534
|
+
|
535
|
+
git clone git://sigma.inf.ug.edu.pl/~wbzyl/test.git
|
536
|
+
|
537
|
+
Własne projekty klonujemy korzystając z SSH:
|
538
|
+
|
539
|
+
git clone ssh://sigma.inf.ug.edu.pl/~wbzyl/public_git/test.git
|
540
|
+
|
541
|
+
albo tak:
|
542
|
+
|
543
|
+
git clone wbzyl@sigma.inf.ug.edu.pl:public_git/test.git
|
544
|
+
|
545
|
+
To ostatnie polecenie nie mówi *explicite*, że ma być użyte ssh.
|
546
|
+
|
547
|
+
|
548
|
+
|
549
|
+
#### Linki
|
550
|
+
|
551
|
+
[git home]: http://git.or.cz "git home"
|
552
|
+
[the-git-parable]: http://tom.preston-werner.com/2009/05/19/the-git-parable.html "The Git Parable"
|
553
|
+
[torvalds on git]: http://www.youtube.com/watch?v=4XpnKHJAok8 "Tech Talk: Linus Torvalds on git"
|
554
|
+
[schwartz on git]: http://www.youtube.com/watch?v=8dhZ9BXQgc4 "Git"
|
555
|
+
[git-in-one-hour]: http://www.oreillynet.com/pub/e/1394 "Git in One Hour"
|
556
|
+
[progit branches]: http://progit.org/book/ch3-1.html "What a Branch Is"
|
557
|
+
|
558
|
+
[tomayko about git]: http://tomayko.com/writings/the-thing-about-git "The Thing About Git"
|