forked from alexshuhin/git-init
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
584 lines (509 loc) · 25.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
<html>
<head>
<link rel="stylesheet" href="css/reveal.css">
<link rel="stylesheet" href="css/theme/night.css">
<link rel="stylesheet" href="css/zenburn.css">
<link rel="stylesheet" href="css/highlight/railscasts.css">
<meta charset="utf-8">
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<section data-background='http://goodarzi.net/wp-content/uploads/2016/03/333.jpg'></section>
</section>
<section>
<h2>Александр Шухин</h2>
<p>Email: <a href="mailto:a.medium@gmail.com">a.medium@gmail.com</a></p>
<p>Telegram: @alex_medium</a></p>
<p>Github: <a href="https://github.com/alexshuhin">alexshuhin</a></p>
</section>
<section>
<section>
<h3>План лекции</h3>
<p>Подготовим машинки к Git в консоле</p>
<p>Немного расскажу про Git</p>
<p>Разберем очень сложные для понимания моменты</p>
<p>Поиграемся в консольке все вместе</p>
<p>Выполним тестовое задание индивидуально</p>
</section>
<section>
<h2>Установка git на macOS</h2>
<p>Проверяем установлен ли Git</p>
<p><pre><code>git --version</code></pre></p>
<p>Если нет, то:</p>
<p>Открываем консоль iTerm</p>
<p>Устанавливаем Homebrew c помощью команды</p>
<p><pre><code>/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</code></pre></p>
<p>Устанавливаем Git</p>
<p><pre><code>brew install git</code></pre></p>
</section>
<section>
<h2>Установка git на Linux</h2>
<p>Проверяем установлен ли Git</p>
<p><pre><code>git --version</code></pre></p>
<p>Если нет, то:</p>
<p>Открываем консоль gnome-terminal</p>
<p>Устанавливаем Git</p>
<p><pre><code>apt-get install git</code></pre></p>
</section>
<section>
<h2>Установка git на Windows</h2>
<p>Заходим на <a href="https://git-scm.com/">https://git-scm.com/</a></p>
<p>Устанавливаем Git</p>
</section>
</section>
<section>
<section>
<h3>Немного о консоли</h3>
</section>
<section>
<p><c>pwd</c> - узнаем в какой директории находимся</p>
<p class="fragment"><c>ls</c> - список файлов текущей директории</p>
<p class="fragment"><c>ls -la ./path</c> - список файлов указанной директории, <c>-l</c> вывод в формате листа, <c>-a</c> вывод спрятанных файлов</p>
<p class="fragment">Пути как в Windows, только вместо <c>\</c> -> <c>/</c>, к примеру <c>styles/common/main.css</c></p>
<p class="fragment">Файловая система регистрозависимая - <c>App.js</c> и <c>app.js</c> - не один и тот же файл</p>
</section>
<section>
<p><c>mkdir new_dir</c> - создаем директорию new_dir в текущей директории</p>
<p class="fragment"><c>cd new_dir</c> - смена текущей директории</p>
<p class="fragment">
<c>..</c> - выход из текущей директории,
<c>~</c> - домашняя директория,
<c>.</c> - текущая директория,
<c>/</c> - путь от корня файловой системы
</p>
<p class="fragment">Файлы/директории начинающиеся с точки, например <c>.git</c> считаются в мире unix скрытыми</p>
</section>
</section>
<section>
<section>
<h3>Что такое Система Контроля Версий?</h3>
</section>
</section>
<section>
<p>
<b>Система управления версиями</b> <i>(Version Control System, VCS)</i> — программное обеспечение для облегчения работы с изменяющейся информацией
<p>
<a href="https://ru.wikipedia.org/wiki/Система_управления_версиями">Википедия — Системы Контроля Версий</a>
</p>
</p>
</section>
<section>
<section>
<h3>Давайте представим</h3>
</section>
<section>
<h3>Вы - разработчик-одиночка</h3>
<p class="fragment">Несколько рабочих компьютеров, на которых приходится работать над одним проектом</p>
<p class="fragment">Не нужно заботиться о резервном копировании проекта</p>
<p class="fragment">Возможность заглянуть в историю изменений каждого файла</p>
<p class="fragment">Экспериментировать, не боясь испортить работающий код</p>
<p class="fragment">Следить за своим процессом разработки</p>
<p class="fragment">Публикация кода на сервере</p>
</section>
<section>
<h3>Вы работаете в команде</h3>
<p class="fragment">Одновременная разработка одного проекта</p>
<p class="fragment">Защита от вандализма, выявление виновных</p>
<p class="fragment">Наслаждаться когда другие работают</p>
<p class="fragment">Просмотр кода с коллегами</p>
<p class="fragment">Интеграция с менеджером задач, такие как Jira, Youtrack, Trello и прочее</p>
</section>
</section>
<section>
<section>
<h3>GIT</h3>
<p>"the stupid content tracker" © man git</p>
</section>
<section>
<h3>Немного истории</h3>
<p class="fragment">
<p><img height="300" src="images/linus.jpg" /></p>
<p>Linus Torvalds начал разработку Git в апреле 2005 года</p>
</p>
<p class="fragment">16 июня 2015 года с помощью git был сделан релиз ядра Linux</p>
<p class="fragment">25 декабря того же года увидела свет первая версия Git</p>
</section>
</section>
<section>
<section>
<h3>Основные моменты Git</h3>
</section>
<section>
<p>Git распределенная система контроля версий (DVCS)</p>
<p>Вам не обязательно иметь сервер для того чтобы обмениваться кодом</p>
<p>Вы можете работать локально со своей версией</p>
</section>
<section>
<h3>Репозиторий</h3>
<p>Это информация о всех изменениях в проекте с момента первого коммита</p>
<p>Явным признаком того что данная директория находится под контролем Git - папочка .git в корне проекта</p>
<p>Её можно удалить, Вы просто потеряете историю проекта</p>
</section>
<section>
<h3>Коммит</h3>
<p>Коммит - это фиксация изменений в истории проекта</p>
<p>
<img src="images/git-index.png" />
</p>
</section>
<section>
<h3>Дерево коммитов</h3>
<p>Коммиты выстраиваются в дерево таким образом, что у каждого коммита (кроме первого) есть родительский коммит (а то и несколько)</p>
<p>
<img src="images/git-tree.png" />
</p>
</section>
<section>
<h4>Связь между родительским и дочерним коммитами</h3>
<p>
<pre><code class="html">
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</code></pre>
</p>
<p>
<pre><code>
<ul>
<li>Item 1</li>
<li>Item 4</li>
<li>Item 3</li>
</ul>
</code></pre>
</p>
<p>
<pre><code>
diff --git a/test.html b/test.html
index 4e1e5e4..23cdccd 100644
--- a/test.html
+++ b/test.html
@@ -1,5 +1,5 @@
<ul>
<li>Item 1</li>
- <li>Item 2</li>
+ <li>Item 4</li>
<li>Item 3</li>
</ul>
</code></pre>
</p>
</section>
<section>
<h3>Ветка</h3>
<p>Альтернативная реальность вашего репозитория</p>
<p>
<img src="images/git-branch.jpg" />
</p>
</section>
</section>
<section>
<p>
<img height="400" src="images/magic.gif" />
</p>
</section>
<section>
<p>Первоначальная настройка Git</p>
<pre><code>
> git config --global user.name "Василий Пупкин"
> git config --global user.email vasiliy.pupkin@gmail.com
</code></pre>
</section>
<section>
<h3>Делаем репозиторий</h3>
<pre><code>
> mkdir my_project
> cd my_project
> pwd
/path/to/my_project
</code></pre>
<p>Инициализируем репозиторий</p>
<pre><code>
> git init
Инициализирован пустой репозиторий Git в /path/to/my_project/.git/
</code></pre>
<p>Смотрим что у нас получилось</p>
<pre><code>
> ls -la
итого 12
drwxr-xr-x 3 medium users 4096 авг 9 14:18 .
drwxr-xr-x 13 medium users 4096 авг 9 14:18 ..
drwxr-xr-x 7 medium users 4096 авг 9 14:19 .git
</code></pre>
</section>
<section>
<section>
<h3>Первый коммит</h3>
<p>Создадим файл <c>index.html</c></p>
<p>Всегда можем узнать о состоянии репозитория</p>
<pre><code>
> git status
На ветке master
Начальный коммит
Неотслеживаемые файлы:
(используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
index.html
ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)
</code></pre>
</section>
<section>
<p>Скажем чтобы git начал следить за файлом, добавив этот файл в индекс</p>
<pre><code>git add index.html</code></pre>
<p>Как дела?</p>
<pre><code>
> git status
На ветке master
Начальный коммит
Изменения, которые будут включены в коммит:
(используйте «git rm --cached <файл>…», чтобы убрать из индекса)
новый файл: index.html
</code></pre>
</section>
<section>
<p>Говорим git'у зафиксировать изменения</p>
<pre><code>
> git commit -m 'initial commit (any comment)'
[master (корневой коммит) 817c15c] initial commit (any comment)
1 file changed, 10 insertions(+)
create mode 100644 index.html
</code></pre>
<p>Ну и последний раз</p>
<pre><code>
> git status
На ветке master
нечего коммитить, нет изменений в рабочем каталоге
</code></pre>
</section>
<section>
<p>Посмотрим на историю</p>
<pre><code>
> git log
commit 817c15c7a3ffcc3242613da0bbd5a059d4a6ee01
Author: Alexander Shuhin <a.medium@gmail.com>
Date: Tue Aug 9 14:45:02 2016 +0300
initial commit (any comment)
</code></pre>
</section>
</section>
<section>
<section>
<h3>Нужно больше коммитов</h3>
<p>Поправим наш <c>index.html</c> и добавим стилей</p>
<p>С помощью diff узнаем что изменилось в index.html</p>
<pre><code>> git diff index.html</code></pre>
<p>Или сразу по всему проекту</p>
<pre><code>> git diff</code></pre>
<p>Посмотрим что произошло и добавим все это в наш индекс</p>
<pre><code>> git add index.html css</code></pre>
<p>Делаем очередной коммит</p>
<pre><code>> git commit -m 'add styles to index.html'</code></pre>
</section>
<section>
<p>Теперь посмотрим на наше дерево коммитов</p>
<pre><code>
> git log --graph --oneline
* 9cdf09f add styles to index.html
* 817c15c initial commit (any comment)
</code></pre>
<p>Уииии! Теперь у нас есть история</p>
</section>
<section>
<p>Мы можем узнать как изменился файл с последнего коммита</p>
<p>
<img src="images/git-diff.png" />
</p>
</section>
</section>
<section>
<section>
<h3>Работаем с ветками</h3>
<p>Ветки это всего лишь ссылка на коммит</p>
<p>С помощью веток мы продвигаем историю</p>
</section>
<section>
<p>Как это выглядит?</p>
<p>
<img height="500" src="images/git-branch2.png" />
</p>
</section>
<section>
<p>Давайте на практике</p>
<p>
<p>Делаем ветку, которая будет указывать на текущий коммит</p>
<pre><code>> git branch new_branch</code></pre>
</p>
<p>Мы по прежнему находимся в ветке master (git status в помощь)</p>
<p>
<p>Перейдем в новоиспеченную ветку</p>
<pre><code>> git checkout new_branch</code></pre>
</p>
<p>Сделаем правки и посмотрим на историю</p>
<pre><code>
> git log --graph --oneline --decorate
* 4f41bd7 (HEAD -> new_branch) add bang to hello world
* 9cdf09f (master) add styles to index.html
* 817c15c initial commit (any comment)
</code></pre>
</section>
<section>
<p>Теперь давайте переместимся во времени</p>
<p>Переходим на ветку master</p>
<pre><code>> git checkout master</code></pre>
<p>Сделаем правку и закоммитим. Посмотрим историю</p>
<p>
<img src="images/git-branch3.png" />
</p>
</section>
<section>
<p>Теперь мы имеем 2 ветки.</p>
<p>Мы можем объединить правки с помощью <c>git merge</c></p>
<pre><code>> git merge new_branch</code></pre>
<p>Git попросит нас поправить комментарий</p>
<p>Смотрим историю</p>
<p>
<img src="images/git-branch4.png" />
</p>
</section>
</section>
<section>
<section>
<h3>Конфликты</h3>
<p>Конфликты возникают когда необходимо объединить правки с помощью <c>git merge</c>, но в обеих ветках делались правки над одними и теми же строчками кода</p>
<p>Git делает все так, что Вы не получаете эффекта неожиданности.</p>
</section>
<section>
<h3>Воспроизведем</h3>
<p>Делаем новую ветку <c>another_branch</c>, переходим в неё</p>
<p>Делаем правки, делаем коммит</p>
<p>Возвращаемся в <c>master</c></p>
<p>Делаем правки в тех же строчках, делаем коммит</p>
<p>Теперь мы попытаемся сделать <c>git merge</c></p>
</section>
<section>
<p>Вот что мы получим</p>
<p>
<img src="images/git-conflict.png" />
</p>
</section>
<section>
<p>А вот как <c>git diff</c> нам поможет</p>
<p>
<img src="images/git-conflict2.png" />
</p>
</section>
<section>
<p>Теперь мы должны разрешить этот конфликт чтобы не испортить работающий код</p>
<p>Открываем файл конфликта в редакторе, и пытаемся получить желаемый результат</p>
<p>Теперь когда мы уверены в том что наш код выглядит так как надо, говорим Git'у о том что этот файл можно коммитить</p>
<pre><code>
> git add index.html
> git commit
</code></pre>
</section>
<section>
<img src="images/git-conflict3.png" />
</section>
</section>
<section>
<section>
<h3>Удаленные репозитории</h3>
<p>Мы можем сказать Git места где ещё лежит код. Часто это центральный репозиторий на каком нибудь Github</p>
<p>С этого репозитория мы можем получать изменения, а так же зальвать туда свои коммиты, ветки</p>
</section>
<section>
<p>Склонируем наш репозиторий в соседнюю папку</p>
<pre><code>
> cd .. # перейдем в директорию выше
> git clone my_project my_project_clone # операция клонирования
> cd my_project_clone # перейдем в новый проект
</code></pre>
<img src="images/git-remote.png" />
</section>
<section>
<p>Сделаем правки в мастер с сделаем коммит, как обычно</p>
<p>Теперь мы можем залить наш новый коммит в центральный репозиторий</p>
<pre><code>
> git push origin master
</code></pre>
</section>
<section>
<p>На центральном репозитории при этом создался коммит, как если бы мы работали в нем, ветка <c>master</c> продвинулась</p>
</section>
<section>
<p>Если мы хотим получить новую версию ветки <c>master</c>, мы должны выполнить следующую команду</p>
<pre><code>
> git pull origin/master:master
</code></pre>
<p>Вот и вся магия!</p>
</section>
</section>
<section>
<h3>Почти закончили</h3>
<p>Информации по Git очень много, вот парочка:</p>
<ul>
<li>Must read <a href="https://git-scm.com/book/ru/v2">Git - Book</a></li>
<li>Хорошая статья на Opennet: <a href="http://www.opennet.ru/base/dev/git_edit_history.txt.html">Opennet - Git</a></li>
<li>Официальный мануал по Git: <c>man git</c></li>
</ul>
</section>
<section>
<h1>Вопросы?</h1>
</section>
<section>
<h3>Практика</h3>
<ul>
<li>Зарегистрироваться на GitHub</li>
<li>Создать на GitHub репозиторий проекта</li>
<li>Создать локально репозиторий проекта</li>
<li>Связать репозитории</li>
<li>Сделать первый коммит</li>
<li>Сделать 2 ветки и спровоцировать конфликт</li>
<li>Разрешить конфликт, слить изменения, обновить удаленный и локальный репозитории. Продемонстрировать саппортам.</li>
</ul>
</section>
</div>
</div>
<script src="js/reveal.js"></script>
<script src="js/highlight.pack.js"></script>
<script>
Reveal.initialize();
hljs.initHighlightingOnLoad();
</script>
<script id="__bs_script__">//<![CDATA[
document.write("<script async src='http://HOST:3000/browser-sync/browser-sync-client.2.14.0.js'><\/script>".replace("HOST", location.hostname));
//]]></script>
</body>
</html>
<!--
1. Что такое система контроля версий:
Что дает инструмент:
Если бы человек работал один над проектом:
- Работа с кодовой базой на нескольких компьютерах
- Резервирование кода
- Ревизия кода с возможностью восстановления
- Возможность быстро попробовать вариант, не портя код без боли откатываться на предыдущую вепсию
- Мотивировать себя историей частых коммитов, как наглядный показатель производительности
- CI, способ разворачивания продукта на боевом сервере
Если бы человек работал в команде:
- Одновременная работа с одними и теми же файлами, одним проектом
- Выявление ответственного человека за говнокод
- Трекинг активности через коммиты
- Ревью кода ответственными людьми (гитлаб, локальный репозиторий)
- Сложности связанными в рабочим процессом, интеграцией с issue трекерами
2. Какие системы контроля версий существуют
Рассказать про CVS и DVS
CVS: CVS, Svn
DVS: Git, Mercurial, Bazaar
DVS vs CVS, преимущества и недостатки. Особенности DVS по сравнению с CVS:
Преимущества:
"Недостатки":
- Освоение инструмента сложнее - ну что поделаешь!
- Полная копия проекта при клонировании, невозможность работать с частью проекта, с отдельной директорией
- Система разграничения прав не входит в Git. Это прерогатива сторонних инструментов, например Gitlab, Github и прочих сервисов
3. История Git:
Почему и когда появился Git. Почему он консольный, и почему это хорошо. Какие есть варианты не думать о консоле.
Во что конкретно вырос Git, что такое Github и прочие инструменты для удобства кодопроизводства.
4. Начинаем работать с Git
-->